插入 XML 数据时,将数据记录作为前缀的无效字符(?)到数据库列 [关闭]

Posted

技术标签:

【中文标题】插入 XML 数据时,将数据记录作为前缀的无效字符(?)到数据库列 [关闭]【英文标题】:Invalid character(?) being prefixed to the data record into database column when inserting XML data [closed] 【发布时间】:2011-11-28 07:47:22 【问题描述】:

我在插入数据库的数据中发现了一种奇怪的行为。当我插入一条记录时,在表格中说“table1”,其中一列包含如下值:

?<?xml version="1.0" encoding="utf-8" ?> 
- <OrderPayLoad xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<OrderID>182806333</OrderID> 
<CreatedDateTime>2011-11-27T22:59:37.56</CreatedDateTime> 
<MarketCode>XXX</MarketCode> 
<AccountNumber>0</AccountNumber> 
<MobileNumber>0</MobileNumber> 
<OrderTotal>0</OrderTotal> 
<OrderTaxTotal>0</OrderTaxTotal> 
<PaymentMethod>NCC</PaymentMethod> 
<ReceiptMethod>P</ReceiptMethod> 
<ShippingInfo>
<FreightTypeID>1</FreightTypeID> 
<ShippingAddressType>STANDARD</ShippingAddressType> 
</ShippingInfo>
<BillingInfo>
<BillToZip>-</BillToZip> 
</BillingInfo>
<OrderDetails /> 
<PaymentCard /> 
<OrderRoutingID>2</OrderRoutingID> 
</OrderPayLoad>

直到我到达dbTransaction.Commit() 我在专栏中看到了上面的XML 数据。当我检查数据库并提取相同的记录时,我看到一个额外的字符作为 XML 的前缀。

知道为什么会这样吗?

【问题讨论】:

它可能是一个字节顺序标记(BOM)。在将 XML 插入数据库之前检查您的源 XML。 en.wikipedia.org/wiki/Byte_order_mark 【参考方案1】:

你错过了结束标签&lt;/OrderPayLoad&gt;,所以下面是正确的xml,请使用这个:

<?xml version="1.0" encoding="utf-8" ?> 
<OrderPayLoad xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <OrderID>182806333</OrderID> 
    <CreatedDateTime>2011-11-27T22:59:37.56</CreatedDateTime> 
    <MarketCode>XXX</MarketCode> 
    <AccountNumber>0</AccountNumber> 
    <MobileNumber>0</MobileNumber> 
    <OrderTotal>0</OrderTotal> 
    <OrderTaxTotal>0</OrderTaxTotal> 
    <PaymentMethod>NCC</PaymentMethod> 
    <ReceiptMethod>P</ReceiptMethod> 
    <ShippingInfo>
        <FreightTypeID>1</FreightTypeID> 
        <ShippingAddressType>STANDARD</ShippingAddressType> 
    </ShippingInfo>
    <BillingInfo>
        <BillToZip></BillToZip> 
    </BillingInfo>
    <OrderDetails /> 
    <PaymentCard /> 
    <OrderRoutingID>2</OrderRoutingID>
</OrderPayLoad>

【讨论】:

我已从数据库中插入原始 XML 数据。如果你看到 ”?”字符位于 XML 的开头 能否请您更新插入列的数据类型,谢谢您的时间。 您的 xml 在格式上无效,可以安全地将适当的 xml 插入到您的表中,但是如果您使用的列数据类型不是 xml,那么它应该在没有任何错误的情况下插入,如果您仍然在这种情况下出现错误,请在您的 xml 之前使用 N,例如 N&lt;?xml version="1.0" encoding="utf-8" ?&gt;.... ,希望这会有所帮助,感谢您的宝贵时间。 command.Parameters.Add(new SqlParameter("@PayLoad", _payLoad.Trim()));当我尝试从后面的代码插入时使用上面的行。下面是存储过程中的类型声明,@PayLoad text 我无法修改代码,因为它有数百个依赖项。为什么是 ”?”自动添加到文本列的前缀。你知道它为什么被插入吗?【参考方案2】:

您的 SQL 列的数据类型是什么?前缀 char 可以是 UTF-8 使用的“BOM”(字节顺序标记)。如果您的列是 text、char 或 varchar 而不是 ntext、nchar 或 nvarchar,这可能会导致数据前面出现额外的符号。

【讨论】:

command.Parameters.Add(new SqlParameter("@PayLoad", _payLoad.Trim()));当我尝试从后面的代码插入时使用上面的行。 -- 下面是存储过程中的类型声明,@PayLoad text @MubashirKoul 尝试将“text”更改为“ntext”【参考方案3】:

此问题已自动修复,已尽力重现。无法找到真正的根本原因。

【讨论】:

以上是关于插入 XML 数据时,将数据记录作为前缀的无效字符(?)到数据库列 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

选择无效字符的 Oracle SQL 问题

插入错误:java.sql.SQLException:ORA-00911:无效字符

数据结构-前缀树trie

前缀判断 电话列表

mybatis插入数据传入值为null时提示无效的列类型

sQL数据库表的主键列设为标识,增量为1,下次插入数据时能不插入主键列吗