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