【问题标题】:Convert an XML UTF-8 encoded string to XML datatype in SQL Server在 SQL Server 中将 XML UTF-8 编码字符串转换为 XML 数据类型
【发布时间】:2020-04-07 05:51:52
【问题描述】:

使用 CAST(AS XML) 转换 XML 字符串在许多情况下都可以按预期工作,但如果字符串包含重音字符,则会失败并出现错误“非法 xml 字符”。

此示例失败并出现错误“XML 解析:第 2 行,字符 8,非法 xml 字符”:

declare @Text VARCHAR(max) = 
'<?xml version="1.0" encoding="UTF-8"?>
<ROOT>níveis porém alocação</ROOT>'

select CAST(@Text AS XML)

根据XML Specification,它们都是合法的 XML 字符,但是用“X”字符替换重音字符将导致 CAST 成功:

declare @MessageText VARCHAR(max) = 
'<?xml version="1.0" encoding="UTF-8"?>
<ROOT>nXveis porXm alocaXXo</ROOT>'

select CAST(@MessageText AS XML)

结果:&lt;ROOT&gt;nXveis porXm alocaXXo&lt;/ROOT&gt;

此外,相同的 XML 但 UTF-16 编码,莫名其妙地工作:

declare @MessageText NVARCHAR(max) = 
'<?xml version="1.0" encoding="UTF-16"?>
<ROOT>níveis porém alocação</ROOT>'

select CAST(@MessageText AS XML)

结果:&lt;ROOT&gt;níveis porém alocação&lt;/ROOT&gt;

这些字符在 UTF-8 中是非法的吗?或者有更好的方法来转换成 XML 数据类型?

【问题讨论】:

  • 在第一个示例中,您声明了 Text 变量,但选择了 MessageText。如果替换变量名,它在我的服务器上工作正常。

标签: sql sql-server xml tsql utf-8


【解决方案1】:

SQL Server 在内部为 XML 数据类型去除任何 XML 声明序言,并使用 UTF-16 编码。以下是如何正确处理您的用例。

SQL

-- Method #1
DECLARE @Text NVARCHAR(MAX) = N'<ROOT>níveis porém alocação</ROOT>';
SELECT CAST(@Text AS XML);

-- Method #2
DECLARE @MessageText NVARCHAR(MAX) = 
'<?xml version="1.0" encoding="UTF-16"?>
<ROOT>níveis porém alocação</ROOT>';

SELECT CAST(@MessageText AS XML);

【讨论】:

猜你喜欢
  • 2014-06-22
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2014-01-08
  • 2013-07-01
  • 1970-01-01
  • 2010-09-12
相关资源
最近更新 更多