SQL Server 和 UTF-8 XML

问题描述 投票:0回答:1

我四处搜索并注意到 SQL Server 和 UTF-8 的一些问题。

从其他线程中我看到,如果直接在 XML 中使用特殊字符(例如表情符号),则会丢失一些数据。

DECLARE @DT VARCHAR(MAX) = '<?xml version="1.0" encoding="utf-8"?>
<Name>😎</Name>
'

DECLARE @XML XML
SET @XML = @DT

SELECT @XML 

-- Result: <Name>??</Name>

这很好。

但是当我使用

<Name>ä</Name>
<Name>€</Name>
SQL 会抛出错误:

Msg 9420, Level 16, State 1, Line 6
XML analysis: Line 2, character 7, invalid XML character.

这是为什么?

sql-server xml utf-8
1个回答
0
投票

这种行为完全是预料之中的。将类似

<?xml version="1.0" encoding="utf-8"?>
的内容放在文字字符串的开头不会改变所述文字字符串的排序规则,并且您拥有的文字字符串是varchar
。我不知道您使用的排序规则是什么,但如果您使用的是 UTF-8 排序规则数据库,则不会出现问题。然而,您不是,这意味着,像 
😎
 这样的字符当然无法表示,因为它远远超出了 ASCII 字符范围。

如果您无法使用 UTF-8 数据库,那么您需要将文字字符串和变量定义为

nvarchar

。然后,当您设置 
@XML
 变量的值时,需要将 
COLLATE
CONVERT
 值设置为 UTF-8 排序规则,并且 
varchar
:

DECLARE @DT nvarchar(MAX) = N'<Name>😎</Name>'; DECLARE @XML xml; SET @XML = CONVERT(varchar(MAX),'<?xml version="1.0" encoding="utf-8"?>' + @DT COLLATE Latin1_General_100_CI_AI_SC_UTF8); SELECT @XML;
    
© www.soinside.com 2019 - 2024. All rights reserved.