2010-12-06 62 views
1

我正在使用Microsoft的sqlsrv PHP驱动程序(在Windows 2003服务器上)将大量文本写入text列。字符串数据,在SQLSRV PHP驱动程序中的右截断

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

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

下限(触发错误)似乎是围绕4011字符,上限8024中有可能会推动数据库中的其他一些列它通过两个幂的边界(4096和8192)。

无论正在运行的SQL如何,都会发生这种情况。作为测试的情况下,我们运行了以下内容:

$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)列)。

编辑:使用带有varchar列的UTF-8编码时会出现这种情况,但在使用标准编码时不会出现这种情况。

+0

您是否尝试过运行SQL Server Profiler来跟踪有问题的调用? – 2010-12-07 01:06:00

回答

0

如果与参数喂附加参数,错误消失:

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

这可能与它传递一个UTF-8值转换成一个varchar(相对于nvarchar的)列中的事实。