이 문서는 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 켜기) 엔 기호는 메커니즘에 의해 Autotranslation 문자 코드 157에서 문자 코드 165로 다시 변환되었기 때문에 코드 페이지 1252 응용 프로그램에 올바르게 표시됩니다.
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의 데이터베이스 코드 페이지와 다를 때 문자 데이터가 잘못 표시되는 것을 참조하세요.