Varchar(max)神秘问号中的XML文本

时间:2014-10-03 19:58:47

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

我在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列,数据和ID。

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

由于

2 个答案:

答案 0 :(得分:0)

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

切换到nvarchar,你不会摆脱那个初始角色,但你也不会失去它

答案 1 :(得分:0)

首先,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(除非你处理真正的exotique)。