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

Posted

技术标签:

【中文标题】PHP PDO ODBC - 等于运算符中的数据类型不兼容【英文标题】:PHP PDO ODBC - The data types are incompatible in the equal to operator 【发布时间】:2012-11-17 11:38:26 【问题描述】:

我似乎无法让带有参数的简单 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 ext\pdo_odbc\odbc_stmt.c:254)

我已经以多种不同的方式尝试过这个查询,例如

未命名:

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

未命名并使用 bindValue 将其设置为字符串

$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),因此假设发送的参数是“文本”类型,即使我将其指定为字符串值(char,varchar)

我无法更改数据库,因为它是用于其他软件的。

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

谢谢。

【问题讨论】:

遇到同样的问题...你解决了吗? 你试过"SELECT TOP 1 * FROM bksb_Resources WHERE ResourceType LIKE ?"˙ 吗?如果不使用通配符,它​​的功能几乎与= 相同。 【参考方案1】:

我们遇到了类似的问题,在我们的案例中,我们的/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

我不确定其原因,但我怀疑它可能记录在某处。

【讨论】:

【参考方案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

注意警告:

char 和 varchar 数据类型支持代码页翻译, 但不适用于文本数据类型。与早期版本的 SQL Server 一样, 不报告代码页翻译期间的数据丢失。

希望对你有帮助!

【讨论】:

以上是关于PHP PDO ODBC - 等于运算符中的数据类型不兼容的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中通过 ODBC(使用 PDO)查询雪花返回不正确的数据

PHP PDO ODBC 连接

PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】

PDO 找不到 ODBC 驱动程序

PDO_ODBC:未找到数据源名称且未指定默认驱动程序

在第 256 个字符处截断数据 - PHP 与 HFSQL 数据库,使用 PDO ODBC 试点