1

"기존"이유 때문에 많은 데이터가 사용되는 인코딩과 함께 표준 varchar 열로 인코딩되어 저장됩니다.저장된 SQL Server에서 문자 인코딩을 변환 할 수 있습니까?

xml 문자열을 C#의 저장 프로 시저에 전달하려는 일괄 업로드 루틴을 만들고 있습니다. xml 문자열은 원하는 대상 인코딩을 나타내는 속성을 갖는 각 요소 (예 : Shift-JIS for Japanese)와 함께 모두 유니 코드로 구성됩니다.

Transact-SQL에서 이러한 종류의 변환을 수행하기 위해 SQL Server에 기본 제공되는 메커니즘이 있습니까?

답변

1

데이터를 유니 코드로 저장하십시오. 원하는 '인코딩'을 다른 열로 저장하십시오. 응용 프로그램에서 데이터 (유니 코드)와 원하는 인코딩을 모두 반환하십시오. 유니 코드 데이터를 속한 프리젠 테이션 계층에서 원하는 인코딩으로 변환하십시오.

+0

나는 레거시 시스템이라고 말했기 때문에 데이터의 저장을 유니 코드. 이것이 전체적인 문제입니다. –

+1

그런 다음 적절한 인코딩으로 데이터를 저장할 수 없습니다. 그것으로 간단합니다. –

+0

충분히 공정한, 나는 아마 그 경우 일 것이라고 생각했다. 건배. –

0
CAST(field AS varchar) [COLLATE][1] your collision 
+0

어떻게 사용하나요? 나는 SELECT CAST ('English'를 varchar (50)로 사용했다.) COLLATE 'Shift_JIS'하지만 문법 오류가 발생한다. –

+1

COLLATION! = encoding –

0

NVARCHAR을 대상 데이터 유형으로 사용하여 XML에서 데이터를 간단하게 추출 할 수 있으면이 작업을 수행 할 수 있어야합니다.

DECLARE @SourceXML XML = N' 
<Test> 
    <Row> 
    <Something Collation="Hebrew_100_CI_AS">בליפ</Something> 
    </Row> 
    <Row> 
    <Something Collation="Japanese_XJIS_100_CI_AS">如抜範浪偃壅國</Something> 
    </Row> 
</Test>'; -- the @Collation attribute is not necessary; only there for visual indication 

DECLARE @Test TABLE 
(
    HebrewCollation VARCHAR(20) COLLATE Hebrew_100_CI_AS, 
    Latin1Collation VARCHAR(20) COLLATE Latin1_General_100_CI_AS, 
    JapaneseCollation VARCHAR(20) COLLATE Japanese_XJIS_100_CI_AS 
); 

INSERT INTO @Test ([HebrewCollation], [Latin1Collation], [JapaneseCollation]) 
    SELECT tab.col.value('(./Something/text())[1]', 'NVARCHAR(100)'), 
     tab.col.value('(./Something/text())[1]', 'NVARCHAR(100)'), 
     tab.col.value('(./Something/text())[1]', 'NVARCHAR(100)') 
    FROM @SourceXML.nodes(N'/Test/Row') tab(col); 

SELECT *, 
     DATALENGTH([HebrewCollation]) AS [HebrewColumnBytes], 
     DATALENGTH([JapaneseCollation]) AS [JapaneseColumnBytes] 
FROM @Test; 

반환 :

데이터 정렬이 열을 제대로 지정 (그리고 좀 데이터 손실을하지 이미 위해서는이어야한다)하는 경우, 그것은 적절한 코드 페이지로 변환해야합니다
HebrewCollation Latin1Collation JapaneseCollation HebrewColumnBytes JapaneseColumnBytes 
בליפ 
       ????    ????    4     4 
???????   ???????   如抜範浪偃壅國  7     14 

결과 행 (1)으로 인해 두 라인에 오른쪽에서 왼쪽으로 VS 왼쪽에서 오른쪽으로 행 1에 대한 4의 값 werbeH ;-)

은 "HebrewColumnBytes"에 의한 표시 문제 히브리어 _ * 데이터 정렬은 단일 바이트 문자 집합 인 코드 페이지 1255를 사용합니다. 마찬가지로 행 2에 대한 14의 "JapaneseColumnBytes"값은 일본어 _ 데이터 정렬이 2 바이트 문자 세트 인 코드 페이지 932를 사용하므로 정확합니다.

관련 문제