클라이언트 코드 페이지가 서버 코드 페이지와 다른 경우 SQL Server ODBC 드라이버를 사용하여 클라이언트에서 서버로 문자 데이터를 올바르게 변환할 수 없습니다.

이 문서는 SQL Server ODBC 드라이버를 사용할 때 클라이언트 데이터를 잘못 변환하는 문제를 해결하는 데 도움이 됩니다.

원래 제품 버전: SQL Server
원본 KB 번호: 234748

증상

MDAC 2.1 이상 버전의 SQL Server ODBC 드라이버(버전 3.70.0623 이상) 또는 OLEDB 공급자(버전 7.01.0623 이상)를 사용하는 경우, 경우에 따라 클라이언트 코드 페이지에서 서버 코드 페이지 Autotranslation 로 문자 데이터를 변환할 수 있습니다.

원인

Autotranslation 는 코드 페이지 변환을 초래할 수 있는 유일한 메커니즘이 아닙니다. SQL Server 7.0 ODBC 드라이버 및 OLEDB 공급자는 MSDE 1.0, SQL Server 7.0 이상 버전에 연결할 때 새로운 동작을 도입합니다. 언어 이벤트로 전송된 모든 SQL 문은 서버로 전송되기 전에 클라이언트에서 유니코드로 변환됩니다. 최종 효과는 Autotranslation 연결에 대한 현재 Autotranslation 설정에 관계없이 언어 이벤트를 통해 클라이언트에서 서버로 흐르는 모든 데이터의 입니다. SQL Server 코드 페이지 이외의 코드 페이지에서 번역되지 않은 문자 데이터를 저장하려고 하는 경우를 제외하고는 문제가 발생하지 않습니다.

해결 방법

코드 페이지 X 데이터를 코드 페이지 Y SQL Server 저장하지 마세요(예: 코드 페이지 1252 서버의 코드 페이지 950 데이터). 이전 버전의 SQL Server 일부 상황에서는 가능하지만 항상 지원되지 않습니다. 1252 SQL Server 1252자를 제외한 모든 항목은 유효한 문자 데이터가 아닙니다. 다른 코드 페이지의 유니코드가 아닌 문자 데이터는 올바르게 정렬되지 않으며 DBCS(이중 바이트) 데이터의 경우 SQL Server 문자 경계를 올바르게 인식하지 못합니다. 심각한 문제가 발생할 수 있습니다.

SQL Server 코드 페이지에 가장 적합한 방법은 서버에 액세스할 클라이언트의 코드 페이지입니다.

서버와 클라이언트에는 서로 다른 코드 페이지가 있을 수 있지만, 모든 경우에 서버의 코드 페이지와 데이터를 적절히 변환할 수 있도록 클라이언트에서 자동 변환을 사용하도록 설정해야 합니다.

서버가 여러 코드 페이지의 데이터를 저장해야 하는 경우 지원되는 솔루션은 데이터를 유니코드 열(NCHAR/NVARCHAR/NTEXT)에 저장하는 것입니다.

코드 페이지 X 데이터를 코드 페이지 Y SQL Server 저장해야 하는 경우 이 작업을 안정적으로 수행하는 방법은 두 가지뿐입니다.

  • 데이터를 이진 열(BINARY/VARBINARY/IMAGE) 열에 저장합니다.
  • 문자 데이터를 처리하는 모든 SQL 문에 RPC(원격 프로시저 호출)를 사용하도록 애플리케이션을 작성합니다. RPC 이벤트를 통해 전송된 데이터는 변환의 대상이 아닙니다. 전송되는 이벤트의 유형을 변경하기 위해 수행할 수 있는 작업은 드라이버 또는 DSN 수준에 없습니다. 명령이 언어 또는 RPC 이벤트로 전송되는지 여부는 애플리케이션을 작성할 때 프로그래머가 선택한 API 및 구문에 전적으로 따라 달라집니다.

추가 정보

자동 변환(즉, 최신 ODBC 애플리케이션의 문자 데이터 변환 수행 확인란)은 유니코드를 번역 매체로 사용하여 데이터를 서버로 보내기 전에 클라이언트 코드 페이지에서 서버 코드 페이지로 문자 데이터를 변환합니다. 그러나 3.7 SQL Server ODBC 드라이버는 또한 언어 이벤트로 전송된 모든 SQL 문을 유니코드로 변환한 후 와이어에 배치합니다. 이 문은 자동 변환과 유사하지만 자동 변환 설정의 적용을 받지 않습니다. 반면 서버에서 클라이언트로 다시 흐르는 문자 데이터는 자동 변환 플래그를 준수합니다. 자동 변환을 해제하면 데이터가 서버에 있는 것과 동일한 문자 코드를 사용하여 클라이언트 애플리케이션에 도착합니다. 마찬가지로, 자동 변환을 해제하여 클라이언트-서버 RPC 이벤트에 대한 데이터 변환을 사용하지 않도록 설정할 수 있습니다. 동작이 언어 이벤트에 미치는 영향을 보여 주는 간단한 스크립트는 다음과 같습니다. 이 예제는 코드 페이지 437 서버에 연결하는 코드 페이지 1252 클라이언트의 Query Analyzer에서 실행되었습니다.

-- Turn Autotranslation off here.
 USE tempdb
 GO
 CREATE TABLE t1 (c1 int, c2 char(1))
 GO

-- Enter a yen character, using the keystroke ALT-0165.
 INSERT INTO t1 VALUES (1, '¥') 
 SELECT c1, c2, ASCII (c2) FROM t1
c1 c2 
 ----------- ---- ----------- 
 1  157

(1 row(s) affected)

앞의 예제에 대한 다음 내용은 다음과 같습니다.

  • Autotranslation 이 일괄 처리 중에 해제되었지만 문자 코드 165(코드 페이지 1252의 엔)는 157(코드 페이지 437의 엔)으로 변환되었습니다. 이는 ODBC 드라이버가 SQL 문자열을 서버로 보내기 전에 유니코드로 변환했기 때문에 서버가 코드 페이지 437에서 스토리지에 적합한 문자로 변환할 수 있었기 때문입니다.
  • 클라이언트가 저장된 데이터를 검색하기 위해 SELECT를 실행했을 때 문자 157은 클라이언트에서 번역되지 않은 상태로 도착했습니다(157은 코드 페이지 1252 클라이언트에서 '' 상자로 표시됨). 이 문서에서 설명하는 변환은 서버에서 클라이언트로가 아니라 클라이언트에서 서버로 전송된 데이터에만 적용되기 때문입니다. 설정이 꺼져 있으므로 Autotranslation 데이터가 변환되지 않았습니다.
-- Turn Autotranslation back on before running the following batch.
 INSERT INTO t1 VALUES (2, '¥')
 SELECT c1, c2, ASCII (c2) FROM t1
c1 c2 
 ----------- ---- ----------- 
 1 ¥ 157
 2 ¥ 157

(2 row(s) affected)

이 경우 다시 켜면 Autotranslation 클라이언트에서 서버로의 변환(즉, 문자 코드 165에서 문자 코드 157로의 동일한 올바른 변환이 발생함)에 영향을 미치지 않았지만 서버에서 검색된 데이터에 영향을 미쳤습니다. SELECT 문이 이번에 실행되면( Autotranslation 켜기) 엔 기호는 메커니즘에 의해 문자 코드 157에서 문자 코드 165로 다시 번역되었기 때문에 코드 페이지 1252 애플리케이션에 Autotranslation 올바르게 표시됩니다.

SQL Server ODBC 드라이버 버전 3.70 이상을 사용하고 SQL Server 7.0 이상에 연결할 때 이 동작(클라이언트에서 언어 이벤트를 유니코드로 변환)이 표시됩니다. 이전 ODBC 드라이버를 사용하거나 3.7 드라이버를 사용하여 SQL Server 6.5 이하에 연결할 때는 발생하지 않습니다. 또한 데이터를 유니코드 열(NCHAR/NVARCHAR/NTEXT)에 저장하는 경우 변환은 문제가 되지 않습니다.

SQL Server 2005에서 문자 데이터가 표시되는 방법에 대한 자세한 내용은 클라이언트 컴퓨터의 코드 페이지가 SQL Server 2005의 데이터베이스 코드 페이지와 다를 때 문자 데이터가 잘못 표현됨을 참조하세요.