在SQL Server 2008中从xml数据类型转换为nvarchar时,Unicode文本是否已损坏?

Ale*_*kin 2 xml sql-server unicode

在我们的数据库中,有关翻译的信息存储在XML列中,我们使用数据类型的.value()函数提取它xml.我们使用nvarchar(100)目标数据类型,但转换后值会被破坏.

以下是示例代码:

DECLARE @x Xml
SET @x =
'<TRANSLATIONS>
    <TRANSLATION Lang="de">Probenname</TRANSLATION>
    <TRANSLATION Lang="pt">Tipo da Amostra</TRANSLATION>
    <TRANSLATION Lang="ru">??? ?????</TRANSLATION>
    <TRANSLATION Lang="eo">Testa?nomo</TRANSLATION>
</TRANSLATIONS>'

SELECT TR.lentry.value('@Lang','varchar(2)') AS Lang,
       TR.lentry.value('.','nvarchar(100)') AS Text    
FROM @x.nodes('/TRANSLATIONS/TRANSLATION') AS TR(lentry)
Run Code Online (Sandbox Code Playgroud)

这是我们得到的输出:

Lang Text
---- ----------
de   Probenname
pt   Tipo da Amostra
ru   ??? ?????
eo   Testajnomo
Run Code Online (Sandbox Code Playgroud)

正如人们可能看到的那样,西里尔语词条完全混杂在一起,而世界语词条则失去了变音符号.

知道如何修复它吗?

gbn*_*gbn 5

您的xml常量是varchar,因此在解析之前数据会丢失.添加N前缀以使其成为varchar

DECLARE @x Xml

-- broke
SET @x =
'<TRANSLATIONS>
    <TRANSLATION Lang="de">Probenname</TRANSLATION>
    <TRANSLATION Lang="pt">Tipo da Amostra</TRANSLATION>
    <TRANSLATION Lang="ru">??? ?????</TRANSLATION>
    <TRANSLATION Lang="eo">Testa?nomo</TRANSLATION>
</TRANSLATIONS>';
SELECT @x;

-- fixed
SET @x =
N'<TRANSLATIONS>
    <TRANSLATION Lang="de">Probenname</TRANSLATION>
    <TRANSLATION Lang="pt">Tipo da Amostra</TRANSLATION>
    <TRANSLATION Lang="ru">??? ?????</TRANSLATION>
    <TRANSLATION Lang="eo">Testa?nomo</TRANSLATION>
</TRANSLATIONS>';
SELECT @x;

SELECT TR.lentry.value('@Lang','varchar(2)') AS Lang,
       TR.lentry.value('.','nvarchar(100)') AS Text    
FROM @x.nodes('/TRANSLATIONS/TRANSLATION') AS TR(lentry);
Run Code Online (Sandbox Code Playgroud)