2010-12-06 2 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. 것으로 나타납니다 사이에, 우리는 다음과 같은 오류가 그것은 2의 거듭 제곱 경계 (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 프로파일 러를 실행하여 문제가있는 호출을 추적 해 보셨습니까? –

+0

나는 mssql 드라이버에서 같은 문제가 있으며'mssql.textlimit = 1052272'와'mssql.textsize = 1052272'로 해결된다. 비록 sqlsrv 드라이버에 해당하는 것을 찾을 수 없습니다. – danielson317

답변

0

는 버그가 사라 :

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

이은 열 (NVARCHAR 대)를 VARCHAR로 UTF-8 값을 전달한다는 사실과 관련이있을 수 있습니다.