簡體   English   中英

我可以在SQL Server存儲過程中轉換字符編碼嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM