[英]Convert an XML UTF-8 encoded string to XML datatype in SQL Server
使用 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 规范,它们都是合法的 XML 字符,但是用“X”字符替换重音字符将导致成功的 CAST:
declare @MessageText VARCHAR(max) =
'<?xml version="1.0" encoding="UTF-8"?>
<ROOT>nXveis porXm alocaXXo</ROOT>'
select CAST(@MessageText AS XML)
结果: <ROOT>nXveis porXm alocaXXo</ROOT>
此外,相同的 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)
结果: <ROOT>níveis porém alocação</ROOT>
这些字符在 UTF-8 中是非法的吗? 或者有更好的方法来转换成 XML 数据类型吗?
SQL Server 在内部去除 XML 数据类型的任何 XML 声明序言并使用 UTF-16 编码。 以下是如何正确处理您的用例。
数据库
-- 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.