【问题标题】:XML text in Varchar(max) mysterious question markVarchar(max)中的XML文本神秘问号
【发布时间】:2014-10-03 19:58:47
【问题描述】:

我在 VB .NET 类库中有一个函数,它将 XML 文本插入到 VARCHAR(MAX) 列中。 该列导致额外的“?”在列中数据的前面。我不想在我的数据中使用那个字符。

列数据开头如下:

  ?<?xml version="1.0" encoding="utf-8"?><Registration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"....

插入函数是:

INSERT INTO Table (Data) OUTPUT Inserted.ID VALUES (@Data)

该表有 2 列,Data 和 ID。

我是不是做错了什么。 XML 由 .Net XmlSerializer 创建。

谢谢

【问题讨论】:

  • 如果它看起来像XML,嘎嘎叫像XML,闻起来像XML ......你到底为什么不存储它在XML 列中!???!!!?!
  • 总猜测,但是 XML 是否在开头使用字节顺序标记 (BOM) 进行编码?你能在调试器中判断插入的数据是否有这个额外的字符(在它进入数据库之前)?
  • 试试 NVARCHAR。你有东西在那里。它甚至可能是一个不在 varchar 中的空格。
  • @marc_s,理论上你是对的,但目前在 MSSQL 中不可能像提供的示例一样存储 XML 及其处理指令。

标签: sql .net sql-server xml vb.net


【解决方案1】:

首先,SQL Server 中的所有 XML 都采用 Unicode(准确地说是 UCS-2),数据访问库可能知道这一点。因此,将它们的输出存储在 varchar 列中并不是最好的主意 - 您可能会遇到隐式转换等各种问题。尝试将列数据类型切换为nvarchar,看看是否有帮助。

其次,它可能是一些通常在以 UTF-8 存储的磁盘文件中找到的标记字节。由于 SQL Server 不支持这种编码,因此这些字节可能已被(再次隐式地)转换为不可读的内容。试试这样的查询:

select cast(substring(XMLField, 1, 10) as varbinary)
from dbo.MyTable;

它至少会显示这些字符的 ASCII 码。

然而,我最好的猜测是完全摆脱 UTF-8 - 在 SQL Server 中存储此类数据的唯一方法是通过 varbinary 列,但我怀疑您会喜欢由此产生的开销。尝试切换到 UTF-16 - 它与 UCS-2 向后兼容(除非您处理真正具有异国情调的东西)。

【讨论】:

    【解决方案2】:

    Varchar 只能保存 ascii 代码页中的字符。我的猜测是您在该字符串的开头有一些 unicode 字符。

    切换到 nvarchar,你不会摆脱那个初始字符,但你也不会丢失它

    【讨论】:

    • 这是不正确的。 Varchar 和 char 将使用 256 个字符的代码页,例如 Windows-1252 或 CP-1252。
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多