我四处搜索并注意到 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.
这是为什么?
这种行为完全是预料之中的。将类似
<?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;