PDO-ODBC不起作用丝毫绑定值,为nvarchar和文字都在等于运算符不兼容(pdo-odbc

2019-09-03 00:24发布

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

<?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'));

返回错误:

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,2.2.14的unixODBC,freetds的0.91,SQL服务器2012年,CentOS的-64 6.4

更新:

似乎是一个错误 。 我发现这个补丁 ,但只适用于SQL Server ODBC驱动程序11 (我试过用freetds的,没有运气)。 我设法从这个补丁从freetds的到ODBC驱动程序11为SQL Server应用和改变源代码安装PHP; 现在正在工作。

  • PHP 5.4.15
  • 2.3.0的unixODBC
  • 对于SQL Server ODBC驱动程序11
  • SQL服务器2012年
  • 的CentOS-64 6.4

Answer 1:

做完研究公平一点到这一点,似乎PDO_ODBC是64位架构车:它的32位SQLLEN和SQLULEN尺寸建造。 微软的驱动程序用来建这种方式,这可能是为什么PHP效仿。 MS以来开始正确遵循ODBC规范,但显然PHP没有。

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

使用斯软件的驱动程序时,再跟我居然发现了同样的问题,通过与他们的问题,发现PDO_ODBC是罪魁祸首。 他们能够为我提供使用32位尺寸内置了64位驱动程序,并且工作正常。

直到64位PHP进行了修补,使用64位SQLLEN和SQLULEN尺寸看起来最好的免费解决方案是使用32位的PHP和ODBC驱动程序。



Answer 2:

同样的错误在这里:

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位,PHP 5.4.12,SQL Server Express的2012年,11 ODBC SQL Server的



文章来源: pdo-odbc doesn't work whit bind values, nvarchar and text are incompatible in the equal to operator