[英]Can I convert character encodings in an SQL Server stored proc?
由於“傳統”原因,我們的許多數據都與使用的編碼一起存儲在標准varchar
列中。
我正在研究一個批量上載例程,在該例程中,我想將xml字符串傳遞給存儲過程(來自C#)。 xml字符串將全部為unicode,每個元素都具有指示所需目標編碼的屬性(例如,日語的Shift-JIS)。
SQL Server中是否有一些內置機制可以在Transact-SQL中進行這種轉換?
將數據存儲為UNICODE。 也將所需的“編碼”存儲為另一列。 在您的應用程序中返回數據(UNICODE)和所需的編碼。 在表示層所屬的表示層中將Unicode數據轉換為所需的編碼。
CAST(field AS varchar) [COLLATE][1] your collision
如果僅使用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
由於werbeH ;-)導致從右到左與從左到右的顯示問題,結果行1位於兩行
行1的“ HebrewColumnBytes”值為4是正確的,因為Hebrew_ *歸類使用代碼頁1255,它是一個單字節字符集。 同樣,第2行的“ JapaneseColumnBytes”值為14是正確的,因為Japanese_ *歸類使用的代碼頁932是雙字節字符集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.