当第二次更新时,MySQL错误地更新了整数列

时间:2012-11-20 14:45:04

标签: mysql sql

我有一个非常奇怪的问题,这让我整天疯狂。我有一个简单的MySQL表,列数很少。一列是int(11)NULL。当我更新其值时,它按预期工作。但是,当我第二次更新其值时,它将被赋予“0”值。

我在我的MySQL 5.1.58-1ubuntu1和其他MySQL 5.0.96社区上测试了这种相同的行为,两者的行为完全相同。所以它显然不是一个版本MySQL的问题。

我很难解释,但我附上了两个截图,它会告诉你更好的地方。

第一个截图是我正在更新的表格的结构:

table structure

此处显示执行的SQL查询,您可以看到,第一次更新是正确的,第二次在“invoice_number”列中生成“0”值,没有理由:

enter image description here

我忽略了一些明显的东西吗?它真的让我发疯,因为它对我没有任何意义......

感谢您提前提供帮助......

编辑:我在我的查询中尝试过仅使用数字,这就是结果(对我来说也很奇怪):

enter image description here

2 个答案:

答案 0 :(得分:2)

这不是答案,但评论越来越拥挤。您显示的行为确实表明存在某种问题,但是在您用于连接数据库而不是数据库的工具中更有可能。

单引号的问题是红鲱鱼(即分心)。即使'55'与55的解释不同,它也会在where语句中以相同的方式解释。此外,'35'有效,但'30'没有。

关键的洞察力是您删除引号时的失败。声明:

update i_orders
    set invoice_number = 30
    where id = 55

不应查找30的列索引。您看到的未知列错误表明发送到数据库的查询不是您在工具中看到的查询。

您可以在数据库中记录查询以查看实际发送的内容吗?

答案 1 :(得分:0)

好的,我终于明白了。问题出在其他地方,而不是MySQL本身。我已经从MySQL查询日志中复制了我的问题中显示的所有SQL查询,因此我从未怀疑可能会有一些奇怪的东西。然而,在“35”值的开头有 - UTF-8字节顺序标记(EF BB BF),当然,它是不可见的。

第一个更新查询源自我的应用程序的不同位置,其值“30”仅为字符串(2)。但是当我在第二个查询中对值进行var_dump时,我注意到“35”实际上是字符串(5)。这个值来自jQuery的$ .get()调用,并附加了这个BOM ...

在这样一个“看不见的”上度过了两天的生命...