2012-06-08 4 views
3

SQL Server의 XML 열에 XML을 저장하고 있습니다. SQL Server는 데이터를 내부적으로 UTF-16에 저장합니다. 따라서 저장된 XML은 UTF-16이어야합니다.UTF8 데이터를 UTF16 열에 저장하십시오.

내가 가진 XML은 UTF-8로, 그것은 상단에이 선언이 있습니다

<?xml version="1.0" encoding="UTF-8" ?> 

내가 인코딩에 대해 뭔가를 말하는 예외를 얻을 UTF-8 선언으로 XML을 삽입 할 때. 나는 쉽게 두 가지 방법으로이 문제를 해결할 수 있습니다

에 선언을 변경하여 선언이나

  • 을 제거하여 :

    <?xml version="1.0" encoding="UTF-16" ?> 
    

    문제

    '안전한지'또는 선언을 제거하거나 바꾸는 것이 정확한지 나는 모른다. 데이터가 손실되거나 XML이 손상됩니까? 또는 C#의 문자열을 utf-8에서 utf-16으로 변환해야합니까?

  • +0

    당신이 이해하고 현재 이해하지 못하는 예외를 인용하는 것은 항상 좋은 생각입니다. –

    +0

    파일을 텍스트로 저장 한 다음 텍스트로 저장합니다 (예 : 보편적 인코딩 사용). 물론 인라인 인코딩 선언을 제거해야합니다. 나는 그러한 것들을 제거 할지라도 얼룩으로 그들을 저장하고 싶을 뿐이다. – Joey

    +0

    SQL Server는 UTF-16이 아니라 UCS-2로 내부적으로 데이터를 저장합니다. 이것은 UTF-16 서로 게이트 쌍을 사용하는 경우에만 중요합니다. –

    답변

    3

    C#은 UTF-16 표준의 이전 버전 인 UCS-2에 문자열을 저장합니다. 따라서 C#에서 UTF-8 문자열을 읽으면 C#이이를 UCS-2로 변환합니다. SQL Server로 전송하는 것은 UCS-2 변형입니다.

    xml 선언을 encoding="UTF-16"으로 변경하거나 생략 할 수 있습니다. UCS-2와 UTF-16에는 몇 가지 차이점이 있습니다. 그게 C# 및 SQL Server에 어떤 영향을 미치는지 알면 흥미로울 것입니다!

    +0

    차이점은 거의 실제적인 영향을 미치지 않습니다. UCS-2는 21 비트 유니 코드 (BMP)의 16 비트 부분 만 나타낼 수 있습니다. 그러나 비 BMP 문자가 대부분의 언어에서 매우 드문 데이터에서 발생하면 두 개의 "대리 문자"로 표현되어 어쨌든 통과합니다. 부정확 한'DATALENGTH' 값을 얻을 수는 있지만 결코 눈치 채지 못할 것입니다. –

    +0

    @ JirkaHanika : UTF-16은 비 -BMP 문자를 나타내는 또 다른 방법을 추가하지만 이전 방법을 무효로하지는 않습니까? – Andomar

    +0

    그렇지 않습니다. 그러나 SQL Server는 BMP가 아닌 문자를 두 개의 "문자"로 취급하여 고정 폭 인코딩으로 계속 처리합니다. 예를 들어,'nvarchar (1)'컬럼을 가지고 있다면, 비 BMP 문자를 전혀 넣을 수 없습니다. –

    0

    SQL Server는 내부적으로 UCS-2를 사용하여 XML 데이터를 저장하지만 SQL Server에 데이터를 전달하는 형식과는 아무 관련이 없습니다.

    예를 들어 varchar 리터럴을 사용하여 삽입하는 경우 nvarchar 리터럴로 변경하고 인코딩을 UTF-16으로 선언하십시오. 샘플 :

    DECLARE @VAR XML 
    INSERT INTO MyTable (MyXmlColumn) 
        VALUES (N'<?xml version="1.0" encoding="UTF-16" ?><doc></doc>') 
    
    +0

    OP는 C# 클라이언트를 언급 했으므로 아마도 SQL 리터럴을 사용하지 않았을 것입니다. – Andomar

    관련 문제