如何解决在mysql插入时出现“Illegal double... value found during parsing”的问题?

6

一年左右的时间里,我使用了一个php页面将来自csv文件的ebay订单导入到mysql数据库中。以下是我的查询代码:

 "INSERT INTO orders VALUES (0, {$fname}, {$lname}, {$address1}, {$address2}, {$town}, {$county}, {$postcode}, {$country}, {$tel}, {$email}, '', {$postage}, {$subtotal}, {$total}, {$basket},'', 'eBay', now(), 'GBP', 'paypal', 1, '', 1, {$txnId}) ON DUPLICATE KEY UPDATE txnid=txnid, complete=complete, new=new, time=time;";

上周我开始收到错误信息“在解析过程中发现非法的双倍(txnId varchar)值”,这会影响到一些订单的导入。有人建议这是因为$txnId的值没有正确地被分隔。我已经尝试将其更改为'{$txnId}'\'{$txnId}\',虽然这两种方法都可以解决问题,但这样做会导致那些没有问题的订单的txnIds前缀为''。
请问有人能帮我找到修改查询的方法,以便在某些订单上不再收到此错误吗?并且,能否有人向我解释一下这个错误信息的确切含义,以及为什么它只影响某些订单,因为我想了解这个问题并解决它。

3
看起来MySQL将$txnId解释为double类型(它可能包含小写的e)。由于语句中存在未加引号的字符串,我很惊讶它居然能够工作。 - Phil
刚刚检查了一下,它们有一个大写字母 E。你能解释一下为什么这会导致该值作为 double 传递吗? - DJ_Beardsquirt
1
这就是使用像PDO这样的预处理语句编写代码的一个很好的原因。这不仅可以减轻这个问题,而且可能会显著加快插入速度。 - Josiah Hudson
1个回答

6
变量中的 'E' 可能会让系统将其误认为是一个双精度值,因为双精度值可以表示为类似于 "7.012E-5" 的形式。

我该如何在插入之前对$txnId varchar进行消毒?如果它包含E,我尝试将其用引号括起来。但是有很多条目包含E,它们不能解析为双精度浮点数,并且它们最终被输入到表中带有'',这会在稍后处理数据时造成问题。 - DJ_Beardsquirt
我认为 '{$txnId}' 应该可以工作,但我不明白为什么它会在字段前加上 ''。你能给我一个有问题的数据值和一个没有问题的数据值的样本吗? - nanytech
可以的。6L831105EP01160271V72876YH791094可以正常解析,但是546635980E5898057会被解析成一个double类型。如果你需要更多内容,我可以随后提供。 - DJ_Beardsquirt
我尝试将这些示例数据插入测试数据库,但我无法使 '{$txnId}' 在任何数据值上前置 '',即使是空值。当我去掉字符串分隔符时,确实收到了关于双重值的投诉。 - nanytech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接