PRB: SQL Server ODBC 드라이버가 언어 이벤트를 유니코드로 변환한다

기술 자료 번역 기술 자료 번역
기술 자료: 234748 - 이 문서가 적용되는 제품 보기.
이 문서는 이전에 다음 ID로 출판되었음: KR234748
모두 확대 | 모두 축소

현상

특정 상황에서 MDAC 2.1이나 최신 버전의 SQL Server ODBC 드라이버(버전 3.70.0623 이상)나 OLEDB 공급자(버전 7.01.0623 이상)를 사용하면 해당 연결 동안 자동 변환이 비활성화된 경우에도 문자 데이터가 클라이언트 코드 페이지에서 서버 코드 페이지로 변환될 수 있습니다.

원인

자동 변환 외에 다른 메커니즘도 코드 페이지를 변환시킬 수 있습니다. SQL Server 7.0 ODBC 드라이버와 OLEDB 공급자에서는 MSDE 1.0, SQL Server 7.0 또는 이들 제품의 최신 버전에 연결할 때 새로운 동작이 발생합니다. 언어 이벤트로서 보내진 모든 SQL 문이 서버로 보내지기 전에 클라이언트에서 유니코드로 변환됩니다. 이러한 동작으로 인하여 최종적으로 해당 연결의 현재 Autotranslation 설정에 관계 없이 언어 이벤트를 통해 클라이언트에서 서버로 전달되는 모든 데이터가 자동 변환되는 것과 유사한 결과를 얻게 됩니다. 이러한 작업은 SQL Server 코드 페이지 외의 다른 코드 페이지에서 변환되지 않는 문자 데이터를 저장하려고 할 때를 제외하고 어렵지 않은 일입니다.

해결 과정

코드 페이지 X 데이터를 코드 페이지 Y SQL Server에 저장하지 마십시오. 예를 들어, 코드 페이지 950 데이터를 코드 페이지 1252 서버에 저장하지 마십시오. 어떤 상황에서는 이전 버전의 SQL Server를 사용할 경우 이러한 일이 가능할 수도 있지만 본래 지원되는 사항은 아닙니다. 1252 SQL Server에서는 1252 문자 외의 다른 것은 유효한 문자 데이터가 아닙니다. 다른 코드 페이지의 비유니코드 문자 데이터는 올바르게 정렬되지 않고 더블바이트(DBCS) 데이터의 경우에는 SQL Server가 문자 경계를 올바르게 인식하지 못합니다. 따라서 Microsoft 기술 자료의 다음 문서에 설명되어 있는 것과 같은 중대한 문제가 발생할 수 있습니다.
155723 INF: SQL Server에서 DBCS 문자열 잘림
SQL Server의 코드 페이지에 대해서는 해당 서버에 액세스할 클라이언트의 코드 페이지를 선택하는 것이 가장 좋습니다.

서버와 클라이언트가 다른 코드 페이지를 가질 수도 있지만 어떠한 경우에도 서버의 코드 페이지와 적절히 변환된 데이터를 주고 받을 수 있도록 클라이언트에서 자동 변환을 활성화해야 합니다.

서버가 여러 코드 페이지의 데이터를 저장해야 할 경우 데이터를 유니코드 열(NCHAR/NVARCHAR/NTEXT)에 저장해야 합니다.

코드 페이지 X 데이터를 코드 페이지 Y SQL Server에 저장해야 하는 경우 이 작업을 확실하게 수행할 수 있는 방법은 다음 두 가지뿐입니다.
  • 데이터를 이진 열(BINARY/VARBINARY/IMAGE)에 저장합니다. 또는
  • 문자 데이터를 다루는 모든 SQL 문에 대해 원격 프로시저 호출(RPC)을 사용하는 응용 프로그램을 작성합니다. RPC 이벤트를 통해 보내지는 데이터는 이러한 변환에 따른 영향을 받지 않습니다. 드라이버 또는 DSN 수준에서는 보낼 이벤트의 유형을 변경하기 위해 할 수 있는 작업이 없습니다. 명령을 언어 또는 RPC 이벤트로서 보낼 수 있는지 여부는 해당 응용 프로그램을 작성할 때 프로그래머가 선택한 API와 구문에 전적으로 의존합니다.

추가 정보

자동 변환(Autotranslation) 즉, 최신 버전의 ODBC 응용 프로그램의 경우 "문자 데이터에 대한 변환 실행(Perform Translation for character data)" 확인란은 데이터를 서버에 보내기 전에 변환 매체로 유니코드를 사용하여 문자 데이터를 클라이언트 코드 페이지에서 서버 코드 페이지로 변환합니다. 그러나 3.7 SQL Server ODBC 드라이버도 언어 이벤트로서 보내지는 모든 SQL 문을 전송하기 전에 유니코드로 변환하는데, 이는 자동 변환과 비슷한 효과가 있지만 Autotranslation 설정의 제어를 받지 않습니다. 반대로 서버에서 다시 클라이언트로 이동하는 문자 데이터는 Autotranslation 플래그의 제어를 받으므로, 자동 변환이 꺼져 있으면 데이터가 서버에서 가졌던 것과 같은 문자 코드로 클라이언트 응용 프로그램에 도달합니다. 마찬가지로 클라이언트-서버 RPC 이벤트에 대한 데이터의 변환도 자동 변환을 끄면 비활성화할 수 있습니다. 다음은 이러한 동작이 언어 이벤트에 영향을 미치는 방법을 보여 주는 간단한 스크립트입니다. 이 예제는 코드 페이지 437 서버에 연결된 코드 페이지 1252 클라이언트의 쿼리 분석기에서 실행된 것입니다.

    -- 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)

앞의 예제에서 다음 사항에 유의하십시오.

  • 이 일괄 처리 동안 자동 변환이 꺼져 있어도 문자 코드 165(코드 페이지 1252의 엔화 기호)가 157(코드 페이지 437의 엔화 기호)로 변환됩니다. 이것은 ODBC 드라이버가 SQL 문자열을 서버로 보내기 전에 서버가 코드 페이지 437로 저장하기 위해 적절한 문자로 변환할 수 있도록 유니코드로 변환하기 때문입니다.
  • 클라이언트가 방금 저장한 데이터를 가져오기 위해 SELECT를 실행하면 문자 157이 클라이언트에 변환되지 않은 채로 도달합니다. 코드 페이지 1252 클라이언트에서 157은 상자 모양의 "?"로 나타납니다. 이것은 이 문서에서 설명하는 변환이 클라이언트에서 서버로 보내지는 데이터에만 적용되고 서버에서 클라이언트로 보내지는 데이터에는 적용되지 않기 때문입니다. Autotranslation 설정이 off이기 때문에 데이터가 변환되지 않은 것입니다.

    -- 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)
이 경우 자동 변환을 다시 켜면 클라이언트에서 서버로의 변환에는 아무런 영향도 미치지 않지만(문자 코드 165에서 문자 코드 157로 동일하고 올바르게 변환되지만) 서버에서 가져오는 데이터에는 영향을 미칩니다. 이 때(자동 변환이 켜 있을 때) SELECT 문을 실행하면 엔화 기호가 자동 변환 메커니즘에 의해 문자 코드 157에서 문자 코드 165로 변환되었기 때문에 문자 코드 1252 응용 프로그램에서도 올바르게 표시됩니다.

이러한 동작(클라이언트에서 언어 이벤트가 유니코드로 변환되는 동작)은 SQL Server ODBC 드라이버 버전 3.70 이상을 사용하고 SQL Server 7.0 이상에 연결할 때 발생합니다. 보다 이전 버전의 ODBC 드라이버를 사용하거나 3.7 드라이버를 사용하여 SQL Server 6.5 이전에 연결할 때는 이러한 동작이 발생하지 않습니다. 또한, 데이터를 유니코드 열(NCHAR/NVARCHAR/NTEXT)에 저장하면 변환과 관련하여 아무런 문제가 생기지 않습니다.



Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.

속성

기술 자료: 234748 - 마지막 검토: 2003년 7월 25일 금요일 - 수정: 2.4
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft Open Database Connectivity 3.7
  • Microsoft Data Engine 1.0
  • Microsoft SQL Server 2000 Standard Edition
키워드:?
kbprb KB234748

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com