SqlSrv v2和长字段名


我的公司承担的大部分项目最终都在带有IIS和SQL Server的Windows服务器上完成,因此我们使用SqlSrv PHP extension来自微软。我们自己不主持任何这些项目,把它留给客户的it部门。这是我们在本例中使用数据库抽象层Zend_Db的主要原因,因为我们可以用更少的麻烦交换底层数据库。

几周前,我在将我们的应用程序安装到客户端服务器上时遇到了一个问题。

没起作用。

这是一个惊喜,因为我们已经测试了几个Windows Server VMWare安装,并且运行良好。最明显的区别是,该服务器是32位的,并且它使用的是SqlSrv扩展的v2。由于客户端的安装与我们通常的安装有许多不同,所以我花了一段时间来(a)构建一个显示出问题的安装,(b)将问题简化为简单的问题。

我得到的错误是:

exception 'Zend_Db_Statement_Sqlsrv_Exception' with message 
'[Microsoft][SQL Server Native Client 10.0]String data, right truncation' 
in C:\Websites\project1\library\Zend\Db\Statement\Sqlsrv.php:237

谷歌完全辜负了我!

我最终缩小了导致问题的SQL语句范围:

SELECT email_user_include_form_details FROM "forms"

这并不特别复杂:)

在这一点上,我大声呼救,它的形式是Brian Swan微软的。如果你关注PHP社区,现在有很多有用的MS朋友,这真的很方便。布莱恩证明了我没有发疯,而且真的有问题。

我们确定问题在于,对于sqlsrv驱动程序的v2,您的字段名称不能超过30个字符。

布莱恩向我保证车队已经意识到了这一点,它将在随后的车手更新中得到修复。而且,它只影响sqlsrv驱动程序,而不影响pdo_sqlsrv驱动程序。因此,有两种解决办法:

1.将字段名称缩短到30个字符或更少
2.使用pdo_sqlsrv

聪明的读者可能已经评论说没有Zend_Db_Adapter_Pdo_Sqlsrv,他们是对的,但编写一个并不难:)

Akrabat_db_adapter_pdo_sqlsrv

我拼凑了一个适合我的适配器,并把它戴上了github由于它不在Zend_命名空间中,我们必须在application.ini文件中使用一个附加键,以便加载它:

Application.ini:

resources.db.adapter = "Pdo_SqlSrv"
resources.db.params.adapterNamespace = "Akrabat_Db_Adapter"
resources.db.params.host = localhostSQLEXPRESS
resources.db.params.username = testuser
resources.db.params.password = testpassword
resources.db.params.dbname = testdatabase

与标准Zend_Db适配器的主要区别在于使用了resources.db.params.AdapterNamespace键,该键告诉系统要加载的类的全名。

我的有限测试表明,这个适配器可以与pdo_sqlsrv的v2一起工作,它解决了字段名超过30个字符的问题!

不幸的是,对于Zend Framework1.11,我发现这一点太晚了,所以我必须考虑将其引入Zend Framework2.0。