我似乎无法获得一个带参数的简单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)
Run Code Online (Sandbox Code Playgroud)
我以多种不同的方式尝试过此查询,例如
无名:
$query = $DBH->prepare("SELECT TOP 1 * FROM bksb_Resources WHERE ResourceType = ?");
$query->execute( array('assessment') );
Run Code Online (Sandbox Code Playgroud)
未命名并使用bindValue将其设置为字符串
$query = $DBH->prepare("SELECT TOP 1 * FROM bksb_Resources WHERE ResourceType = ?");
$query->bindValue(1, 'assessment', PDO::PARAM_STR);
$query->execute( );
Run Code Online (Sandbox Code Playgroud)
命名并使用bindParam将其设置为字符串:
$val = 'assessment';
$query = $DBH->prepare("SELECT TOP 1 * FROM bksb_Resources WHERE ResourceType = :myp");
$query->bindParam(':myp', $val, PDO::PARAM_STR);
$query->execute( );
Run Code Online (Sandbox Code Playgroud)
但无论我怎么做,我总是得到这个错误信息.
有问题的列是类型:varchar(max),因此假设发送的参数是'text'类型,即使我将其指定为字符串值(char,varchar)
我无法更改数据库,因为它是另一个软件.
这是怎么回事?我真的不希望每次我做一个这样的where子句时(或者每个人都这么做?).
谢谢.
我们遇到了与此类似的问题,在我们的案例中,我们的/etc/odbc.ini文件中有以下内容:
[ServerAlias]
Driver = FreeTDS
Server = 1.2.3.4
PORT = 1433
TDS_Version = 8.0
Run Code Online (Sandbox Code Playgroud)
我们发现,如果您将 更改为,TDS_Version我们7.2所有的绑定查询都会开始正常工作。
[ServerAlias]
Driver = FreeTDS
Server = 1.2.3.4
PORT = 1433
TDS_Version = 7.2
Run Code Online (Sandbox Code Playgroud)
我不确定其原因,但我怀疑它可能记录在某处。
您是否尝试过将字段类型更改为 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();
Run Code Online (Sandbox Code Playgroud)
很抱歉,我没有 MS SQL Server 来测试代码,但我从这个页面得到了这个提示:https://msdn.microsoft.com/en-us//library/ms176089.aspx
请注意警告:
char 和 varchar 数据类型支持代码页转换,但文本数据类型不支持。与早期版本的 SQL Server 一样,不会报告代码页转换期间的数据丢失。
希望能帮助到你!
| 归档时间: |
|
| 查看次数: |
1047 次 |
| 最近记录: |