由于“遗留”原因,我们的许多数据varchar
与使用的编码一起存储在标准列中。
我正在处理一个批量上传例程,我想在其中将一个 xml 字符串传递给一个存储过程(来自 C#)。xml 字符串将全部采用 unicode 格式,每个元素都具有指示所需目标编码的属性(例如,用于日语的 Shift-JIS)。
SQL Server 中是否有一些内置机制可以在 Transact-SQL 中进行这种转换?
由于“遗留”原因,我们的许多数据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 是正确的,因为希伯来语_*排序规则使用代码页 1255,它是一个单字节字符集。同样,第 2 行的“JapaneseColumnBytes”值 14 是正确的,因为Japanese_*排序规则使用的是双字节字符集的代码页 932。