字符串数据,SQLSRV PHP驱动程序中的右截断(“甜甜圈洞”)

时间:2010-12-06 23:00:21

标签: php sql-server varchar

我正在使用Microsoft的sqlsrv PHP驱动程序(在Windows 2003服务器上)向text列写入大量文本。

有一个奇怪的“甜甜圈洞”错误,如果文本的长度相当小,则会成功保存,如果文本足够大,它也会成功保存。在这两者之间,我们得到以下错误:

SQLSTATE: 22001
code: 0
message: [Microsoft][SQL Server Native Client 10.0]String data, right truncation 

下限(触发错误)似乎大约为4011个字符,上限为8024.数据库中还有一些其他列可能会将其推到二次幂边界(4096和8192) )。

无论正在运行的是什么,都会发生这种情况。作为测试案例,我们运行了以下内容:

$connectionInfo = array("UID" => "REDACTED", "PWD" => "REDACTED", "Database"=>"REDACTED", "CharacterSet" => "UTF-8");

$conn = sqlsrv_connect("SQLSERVER", $connectionInfo);

$stmt = sqlsrv_prepare($conn, "SELECT LEN(?)", array(&$large_string));

if (!sqlsrv_execute($stmt))
    print_r(sqlsrv_errors());

sqlsrv_free_stmt($stmt);

sqlsrv_close($conn);

我们发现另一个表(使用varchar(max)列)表现出相同的行为。

编辑:将UTF-8编码与varchar列一起使用时会发生这种情况,但在使用标准编码时则不会。

1 个答案:

答案 0 :(得分:0)

如果您使用参数输入其他参数,则错误消失:

$stmt = sqlsrv_prepare($conn, "SELECT LEN(?)", array(array(&$large_string, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING('UTF-8'));

这可能与它将UTF-8值传递到varchar(与nvarchar)列有关。