1

我有一些 xml 编码为 UTF-8,我想将其写入 SQL Server 中的文本字段。UTF-8 与 Text 字节兼容,因此它应该能够做到这一点,然后读出 xml,稍后仍编码为 utf-8。

然而,在 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。而且 Latin1 ÖÄÅ 与 UTF-8 ÖÄÅ 不同。

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

4

4 回答 4

3

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

SET myXMLText = CAST(myXMLBinary as VARCHAR(MAX))
于 2010-05-26T08:23:05.087 回答
3

将您的列定义为 NText 或 NVarchar

于 2010-05-21T15:23:00.077 回答
0

如果要存储 UTF-8 则使用二进制,因为文本在内部存储为 UTF-16

于 2010-05-21T15:21:14.370 回答
0

如果它是 XML 并且如果您使用的是 SQL Server 2005 及更高版本 - 使用 XML 列类型!它比 VARCHAR(MAX) 或 NVARCHAR(MAX) 更快、更紧凑,您可以将其与 XML 模式相关联,从而验证仅存储了有效的 XML……只有好处!

如果您出于某种原因不能使用 XML 列类型,那么至少删除 VARCHAR(MAX) 或 NVARCHAR(MAX) 的 TEXT!TEXT/NTEXT 已被弃用并将消失 - 另外,使用 (N)VARCHAR(MAX),您还可以获得所有在 TEXT/NTEXT 上不起作用的常用字符串函数。

于 2010-05-21T16:01:21.467 回答