首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果绑定值、nvarchar和文本在等于操作符中不兼容,则pdo-odbc无法工作。

如果绑定值、nvarchar和文本在等于操作符中不兼容,则pdo-odbc无法工作。
EN

Stack Overflow用户
提问于 2013-05-13 23:17:43
回答 2查看 3.2K关注 0票数 6

有一个列url(nvarchar(200), not null)

代码语言:javascript
复制
<?php
//
$pdo = new PDO('odbc:mssql', 'xxx', 'yyy');
$pdo->setAttribute(PDO::ATTR_PERSISTENT, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

// plain sql query: WORKS FINE!
$sth = $pdo->prepare("SELECT COUNT(*) FROM pagina WHERE url = '/webito'");
$sth->execute();

// using bindValue: ERROR!
$sth = $pdo->prepare("SELECT COUNT(*) FROM pagina WHERE url = :unique_value");
$sth->execute(array('unique_value' => '/webito'));

返回错误:

代码语言:javascript
复制
Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 402 [FreeTDS][SQL Server]The data types nvarchar and text are incompatible in the equal to operator. (SQLExecute[402] at /builddir/build/BUILD/php-5.4.15/ext/pdo_odbc/odbc_stmt.c:254) in /root/php/test.php on line 13

这是个虫子吗?

使用: php 5.4.15,unixodbc 2.2.14,freetds 0.91,server 2012,centos-x64 6.4

更新:

似乎是一个错误。我找到了这个补丁,但只适用于用于Server的ODBC驱动程序11 (我试过使用FreeTDS,没有运气)。我成功地从源代码中安装了PHP,应用了此修补程序,并将其从FreeTDS更改为用于Server的ODBC驱动程序11;现在正在工作。

  • php 5.4.15
  • unixODBC 2.3.0
  • 用于Server的ODBC驱动程序11
  • sql-server-2012
  • centos-x64 6.4
EN

回答 2

Stack Overflow用户

发布于 2013-08-30 14:58:47

在对此做了大量的研究之后,pdo_odbc似乎在64位架构上存在缺陷:它是由32位SQLLEN和SQLULEN大小构建的。微软的驱动程序以前是以这种方式构建的,这可能就是PHP效仿的原因。从那时起,MS就开始正确地遵循ODBC规范,但显然PHP还没有。

问题中引用的补丁修复了PHP源代码中的一个这样的问题,但似乎不是所有这些问题。使用MS驱动程序和修补的PHP,我仍然无法运行准备好的语句。

实际上,在使用Easysoft的驱动程序时,我发现了同样的问题,通过与他们讨论问题,我发现pdo_odbc是罪魁祸首。他们能够为我提供一个使用32位大小的64位驱动程序,这很好。

在64位PHP修补好使用64位SQLLEN和SQLULEN大小之前,看起来最好的免费解决方案是使用32位PHP和ODBC驱动程序。

票数 1
EN

Stack Overflow用户

发布于 2013-06-05 17:06:33

这里也有相同的错误:

代码语言:javascript
复制
PDOStatement::execute(): SQLSTATE[22001]: String data, right truncated: 0 [Microsoft][SQL Server Native Client 11.0]Die Zeichenfolgedaten wurden rechts abgeschnitten (SQLExecute[0] at ext\pdo_odbc\odbc_stmt.c:254)

Win7 64位,PHP5.4.12,2012,用于Server的ODBC11

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16532694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档