sql - 在 SQL Server 中将 XML UTF-8 编码的字符串转换为 XML 数据类型

标签 sql sql-server xml tsql utf-8

使用 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)

结果:<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 编码。以下是如何正确处理您的用例。

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);

关于sql - 在 SQL Server 中将 XML UTF-8 编码的字符串转换为 XML 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59328295/

相关文章:

sql - sql server中两个日期之间的月份,其中每个日期在sql server中的开始和结束日期

php - PDO + MySQL 总是返回字符串,但是 MsSQL 呢?

sql - 如何在 WHERE LIKE 中对多个值使用 SELECT 语句

c# - 计算 XML 文件中有多少个相等的字符串

python - 在 Python 中使用 %s 会去除 CSV 到 XML 转换中的前导零

java - 更改 xml 标记的值

mysql - 帮忙写sql查询

mysql - 为避免打字错误,如何让 MySql sql 编译器在创建新过程时检查表定义?

C++ 从 SQL Server SELECT 分配变量值

sql - 测试时我想在变量中插入多个值