클라이언트 컴퓨터의 코드 페이지가 데이터베이스의 코드 페이지와 다를 때 문자 데이터가 잘못 표시됩니다.

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

증상

다음과 같은 경우를 생각해볼 수 있습니다.

  • SQL Server Management Studio 사용하여 유니코드가 아닌 데이터 형식을 사용하는 SQL Server 데이터베이스에서 문자 데이터를 쿼리합니다. 예를 들어 SQL Server 데이터베이스는 , varchar또는 text 데이터 형식을 char사용합니다.

  • 클라이언트 컴퓨터의 코드 페이지는 데이터베이스의 코드 페이지와 다릅니다. 코드 페이지는 데이터베이스의 데이터 정렬과 연결됩니다.

이 시나리오에서는 문자 데이터가 잘못 표시됩니다.

예를 들어 다음 문제 중 하나가 발생할 수 있습니다.

  • 문자 데이터는 물음표(?)로 표시됩니다. 문자 데이터를 쿼리하기 전에 문자 데이터를 유니코드가 아닌 데이터 형식으로 삽입하거나 업데이트하면 이 문제가 발생할 수 있습니다. 이 문제는 다른 코드 페이지가 있는 클라이언트 컴퓨터에서 SQL Server Management Studio 사용하여 변경하면 발생합니다.

  • 문자 데이터는 손상된 데이터로 표시됩니다. 코드 페이지 X의 문자 데이터는 코드 페이지 Y의 유니코드가 아닌 열에 저장됩니다. 또한 문자 데이터는 번역되지 않습니다. 이 문제는 SQL Server Management Studio 사용하여 문자 데이터를 쿼리할 때 발생합니다.

    참고

    SQL Server Management Studio 사용하여 문자 데이터를 쿼리할 때 문자 데이터 변환 수행 설정(매개 변수라고도 함Auto Translate)을 사용하지 않도록 설정하면 문자 데이터가 올바르게 표시됩니다. Auto Translate 매개 변수는 microsoft OLE DB Provider for SQL Server 및 Microsoft .NET Framework Data Provider for OLE DB에 대한 속성의 매개 변수 ConnectionString 입니다.

원인

이 문제는 코드 페이지 X의 문자 데이터가 지원되지 않는 코드 페이지 Y의 유니코드가 아닌 열에 저장되기 때문에 발생합니다.

SQL Server 유니코드가 아닌 데이터 형식의 문자열 리터럴을 사용하는 경우 문자열 리터럴은 데이터베이스의 데이터 정렬에서 파생된 데이터베이스의 기본 코드 페이지를 사용하여 변환됩니다. 코드 페이지 X의 문자 데이터를 코드 페이지 Y의 열에 저장하면 데이터가 손실되거나 데이터가 손상될 수 있습니다.

문자 데이터가 손상된 데이터로 표시되는 경우 microsoft OLE DB Provider for SQL Server 또는 OLE DB용 Microsoft .NET Framework Data Provider에 대한 매개 변수를 사용하지 않도록 설정한 Auto Translate 경우에만 데이터를 올바르게 나타낼 수 있습니다.

참고

SQL Server Management Studio microsoft .NET Framework Data Provider for SQL Server 사용하여 SQL Server 데이터베이스에 연결합니다. 이 데이터 공급자는 매개 변수를 Auto Translate 지원하지 않습니다.

해결 방법

이 문제를 해결하려면 다음 방법 중 하나를 사용합니다.

방법 1: 유니코드가 아닌 데이터 형식 대신 유니코드 데이터 형식 사용

코드 페이지 변환으로 인한 모든 문제를 방지하려면 열을 유니코드 데이터 형식으로 변경합니다. 예를 들어 , nvarchar또는 ntext 데이터 형식을 nchar사용합니다.

방법 2: 데이터베이스에 적절한 데이터 정렬 사용

유니코드가 아닌 데이터 형식을 사용해야 하는 경우 항상 데이터베이스의 코드 페이지와 유니코드가 아닌 열의 코드 페이지가 유니코드가 아닌 데이터를 올바르게 저장할 수 있는지 확인합니다. 예를 들어 코드 페이지 949(한국어) 문자 데이터를 저장하려면 데이터베이스에 대한 한국어 데이터 정렬을 사용합니다. 예를 들어 데이터베이스에 Korean_Wansung_CI_AS 대한 데이터 정렬을 사용합니다.

방법 3: "binary" 또는 "varbinary" 데이터 형식 사용

데이터베이스가 적절한 코드 페이지 변환을 수행하지 않고 처리되는 문자의 정확한 바이트 값을 직접 저장하고 검색하려면 또는 varbinary 데이터 형식을 binary 사용합니다.

방법 4: 다른 도구를 사용하여 데이터를 저장 및 검색하고 "자동 번역" 매개 변수를 사용하지 않도록 설정합니다.

경고

코드 페이지 Y의 열에 코드 페이지 X의 문자 데이터를 저장하는 것은 테스트하거나 지원하지 않습니다. 이 작업을 수행하면 언어적으로 잘못된 쿼리 결과, 잘못된 문자열 일치 또는 순서 지정, 예기치 않은 코드 페이지 변환(데이터 손상)이 발생할 수 있습니다. 다른 방법 중 하나를 사용하여 이 문제를 해결하는 것이 좋습니다.

microsoft OLE DB Provider for SQL Server 사용하여 다른 코드 페이지가 있는 데이터베이스에 연결하고 유니코드가 아닌 데이터 형식 열에서 문자 데이터를 쿼리하려는 경우 변환되지 않은 문자를 데이터베이스에 저장해야 합니다.

참고

다음 예제에서는 클라이언트 컴퓨터의 코드 페이지가 한국어(CP949)이고 SQL Server 데이터베이스의 코드 페이지가 영어(CP1252)라고 가정합니다. 코드 예제의 자리 표시자를 상황에 적합한 값으로 바꿔야 합니다.

이 문제를 해결하려면 다음과 같이 하십시오.

  1. 수동으로 문자를 원시 데이터로 변환한 다음 데이터베이스의 코드 페이지를 사용하여 데이터베이스에 데이터를 삽입합니다. 이 작업을 수행하려면 다음 코드 조각과 유사한 코드 조각을 사용합니다.

    string strsrc="가";string strsrc="가";
    string strtag=Encoding.GetEncoding(1252).GetString(Encoding.GetEncoding(949).GetBytes (strsrc));
    sql="insert into <tablename> (<column>,) values ('" + strtag + "')";
    // code for updating the database;
    
  2. 데이터를 쿼리하려는 경우 microsoft OLE DB Provider for SQL Server 또는 Microsoft .NET Framework Data Provider for SQL Server 사용하여 데이터베이스에 연결한 다음 매개 변수를 Auto TranslateFalse설정합니다. 이 작업을 수행하려면 다음 코드 조각과 유사한 코드 조각을 사용합니다.

    OleDbConnection conn=new OleDbConnection("Provider=SQLOLEDB;" +
    " Initial Catalog =<yourdatabase>;"+
    "User id=<youruserid>; Password=<yourpassword>;"+
    "Auto Translate=False");
    // code for representing the character data;
    

추가 정보

문제를 재현하려면 다음 단계를 수행합니다.

  1. 한국어(CP949)가 기본 코드 페이지인 클라이언트 컴퓨터에서 SQL Server Management Studio 시작합니다.

  2. 영어(CP1252)가 기본 코드 페이지인 데이터베이스에 연결합니다.

  3. 다음 쿼리를 사용하여 데이터베이스에 테이블을 만듭니다.

    CREATE TABLE tbTest (A char(20), NA nchar(10), Comment char(20))
    
  4. 다음 쿼리를 사용하여 데이터베이스에 한국어 문자를 삽입합니다.

    INSERT INTO tbTest (A,NA,Comment) VALUES('가',N'가','SQLServer/INSERT')
    
  5. 다음 쿼리를 사용하여 데이터를 검색하는 선택 쿼리를 만듭니다.

    SELECT * FROM tbTest
    

다음과 같은 결과가 표시됩니다. A 열의 값은 물음표입니다.


A                    NA         Comment
-------------------- ---------- --------------------
?                    가          SQLServer/INSERT

참조