【问题标题】:Write utf-8 to a sql server Text field using ADO.Net and maintain the UTF-8 bytes使用 ADO.Net 将 utf-8 写入 sql server 文本字段并维护 UTF-8 字节
【发布时间】:2011-02-22 10:07:59
【问题描述】:

我有一些 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 字节写入文本字段而不改变它们?

【问题讨论】:

标签: c# sql-server utf-8 sqlcommand


【解决方案1】:

将列定义为 NText 或 NVarchar

【讨论】:

  • db 表已经定义并且正在使用中,所以我无法更改它。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我认为只是 NText 将字符存储为 UCS-2。文本将字符存储为单个字节
    【解决方案4】:

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

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

    【讨论】:

    • 我很想使用 xml 类型,但不幸的是我们需要能够以所有格式存储数据。 Varbinary 会是最好的......
    猜你喜欢
    • 2023-03-04
    • 2015-02-23
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 2011-09-06
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多