我正在使用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列一起使用时会发生这种情况,但在使用标准编码时则不会。
答案 0 :(得分:0)
如果您使用参数输入其他参数,则错误消失:
$stmt = sqlsrv_prepare($conn, "SELECT LEN(?)", array(array(&$large_string, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING('UTF-8'));
这可能与它将UTF-8值传递到varchar(与nvarchar)列有关。