将 UTF8 数据存储在 UTF16 列中

本文关键字:UTF16 列中 存储 UTF8 数据 | 更新日期: 2023-09-27 18:36:29

我正在将XML存储在SQL Server的XML列中。SQL Server 以 UTF-16 内部存储数据。因此,存储的 XML 必须采用 UTF-16。

我拥有的XML是utf-8,它的顶部有以下声明:

<?xml version="1.0" encoding="UTF-8" ?>

当我尝试使用 UTF-8 声明插入 xml 时,我收到一个异常,说明有关编码的内容。我可以通过两种方式轻松解决此问题:

  • 通过删除声明或

  • 通过将声明更改为

<?xml version="1.0" encoding="UTF-16" ?>

问题

我不知道删除或替换声明是否"安全"或正确。我会丢失数据,还是 XML 会损坏?还是我必须将 C# 中的字符串从 utf-8 转换为 utf-16?

将 UTF8 数据存储在 UTF16 列中

C# 将字符串存储在 UCS-2(UTF-16 标准的旧版本)中。 因此,当您在 C# 中读取 UTF-8 字符串时,C# 会将其转换为 UCS-2。 它是您传输到 SQL Server 的 UCS-2 变体。

可以将 xml 声明更改为encoding="UTF-16"或完全省略它。 UCS-2 和 UTF-16 之间存在一些差异;我很想知道它如何影响 C# 和 SQL Server!

SQL Server

内部使用 UCS-2 来存储 XML 数据,但这与将数据传递到 SQL Server 的形式无关。

例如,如果使用varchar文本插入它,请改为将其设为nvarchar文本,并将编码声明为 UTF-16。 样本:

DECLARE @VAR XML
INSERT INTO MyTable (MyXmlColumn) 
    VALUES (N'<?xml version="1.0" encoding="UTF-16" ?><doc></doc>')