2010-12-06 60 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的)列中的事實。