我可以在 SQL Server 存储过程中转换字符编码吗?



由于"遗留"的原因,我们的许多数据与使用的编码一起存储在标准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

结果行 1 在两行上,这是由于 werbeH 引起的从右到左与从左到右的显示问题;-)

第 1 行的"HebrewColumnBytes"值 4 是正确的,因为 Hebrew_* 排序规则使用代码页 1255,这是一个单字节字符集。同样,第 2 行的"JapanColumnBytes"值 14 是正确的,因为 Japanese_* 排序规则使用代码页 932,这是一个双字节字符集。

最新更新