使用ADO.Net将utf-8写入sql server文本字段并保持UTF-8字节

我有一些编码为UTF-8的xml,我想将其写入SQL Server中的Text字段。 UTF-8与Text字节兼容,因此它应该能够执行此操作,然后读出仍然编码为utf-8的xml。

但是,在UTF-8中使用多字节的特殊字符(例如ÄÅ)会在途中发生变化。

我有这样的代码:

byte[] myXML = ... SqlCommand _MyCommand = new SqlCommand(storeProcedureName, pmiDB.GetADOConnection()); _MyCommand.CommandType = CommandType.StoredProcedure; _MyCommand.Parameters.Add("xmlText", SqlDbType.Text); _MyCommand.Parameters["xmlText"].Value = Encoding.UTF8.GetString(myXML); _MyCommand.ExecuteNonQuery(); 

我的猜测是将xml字节数组更改为字符串会将特殊字符更改为UTF-16字符,然后再将其更改为Latin1。 拉丁语1ÖÅ与UTF-8ÖÄÅ不同。

如何在不更改的情况下将UTF-8 xml字节写入文本字段?

我开始工作的解决方案是更改存储过程,以便myXml参数为Varbinary(Max),这允许我传入字节数组。 然后在SP中我将Varbinary(max)转换为Varchar(max)。 这样可以保留UTF-8所需的字节数

 SET myXMLText = CAST(myXMLBinary as VARCHAR(MAX)) 

将列定义为NText或NVarchar

如果你想存储UTF-8那么使用二进制文件,因为文本内部存储为UTF-16

如果它是XML,如果你在SQL Server 2005及以上 – 使用XML列类型! 它比VARCHAR(MAX)或NVARCHAR(MAX)更快,更紧凑,您可以将它与XML模式相关联,从而validation只存储有效的XML ….只有好处!

如果由于某种原因无法使用XML列类型,那么至少删除TEXT for VARCHAR(MAX)或NVARCHAR(MAX)! TEXT / NTEXT已被弃用并且将消失 – 加上,使用(N)VARCHAR(MAX),您将获得所有常用的字符串函数,这些函数也不适用于TEXT / NTEXT。