将UTF8数据存储在UTF16列中

时间:2012-06-08 10:17:29

标签: c# sql-server xml

我将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?

2 个答案:

答案 0 :(得分:3)

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!

答案 1 :(得分:0)

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