PHP PDO ODBC - 数据类型在等于运算符中不兼容



我似乎无法获得带有参数的简单 WHERE 子句来工作,我不断收到一条错误消息:

[Microsoft][ODBC SQL Server Driver][SQL Server]The data types varchar(max) and text are incompatible in the equal to operator. (SQLExecute[402] at extpdo_odbcodbc_stmt.c:254)

我以多种不同的方式尝试过此查询,例如

无名:

$query = $DBH->prepare("SELECT TOP 1 * FROM bksb_Resources WHERE ResourceType = ?");
$query->execute( array('assessment') );

未命名并使用绑定值将其设置为字符串

$query = $DBH->prepare("SELECT TOP 1 * FROM bksb_Resources WHERE ResourceType = ?");
$query->bindValue(1, 'assessment', PDO::PARAM_STR);
$query->execute(  );

命名并使用 bindParam 将其设置为字符串:

$val = 'assessment';
$query = $DBH->prepare("SELECT TOP 1 * FROM bksb_Resources WHERE ResourceType = :myp");
$query->bindParam(':myp', $val, PDO::PARAM_STR);
$query->execute(  );

但无论我怎么做,我总是收到这条错误消息。

有问题的列的类型是:varchar(max),所以大概它假设发送的参数是"text"类型,即使我将其指定为字符串值(char,varchar)

我无法更改数据库,因为它适用于另一个软件。

解决这个问题的方法是什么?我真的不想每次我做这样的 where 子句时都必须 CAST (或者这是每个人都会做的吗?

谢谢。

我们遇到了类似的问题,在我们的例子中,我们的/etc/odbc.ini文件中有以下内容:

[ServerAlias]
Driver = FreeTDS
Server = 1.2.3.4
PORT = 1433
TDS_Version = 8.0

我们发现,如果将TDS_Version更改为7.2则所有绑定查询都将开始正常工作。

[ServerAlias]
Driver = FreeTDS
Server = 1.2.3.4
PORT = 1433
TDS_Version = 7.2

我不确定这是什么原因,但我怀疑它可能在某处记录。

您是否尝试过将字段类型更改为 CHAR o VARCHAR?(而不是具有这种不兼容性的 VARCHAR(MAX)。

或者您是否尝试过转换数据类型?

$val = 'assessment';
$query = $DBH->prepare(
    "SELECT TOP 1 * FROM bksb_Resources WHERE
    CONVERT(VARCHAR, ResourceType) = :myp");
$query->bindParam(':myp', $val, PDO::PARAM_STR);
$query->execute();

很抱歉,我没有MS SQL Server来测试代码,但我从此页面得到提示:https://msdn.microsoft.com/en-us//library/ms176089.aspx

请注意,警告:

字符和变量数据类型支持代码页转换, 但不适用于文本数据类型。与早期版本的 SQL Server 一样, 不报告代码页转换期间的数据丢失。

希望对您有所帮助!

最新更新