7

我有一个非常奇怪的问题,这让我整天发疯。我有一个包含几列的简单 MySQL 表。一列是 int(11) NULL。当我更新它的值时,它按预期工作。但是,当我第二次更新它的值时,它被分配了“0”值。

我已经在我的 MySQL 5.1.58-1ubuntu1 和其他 MySQL 5.0.96-community 上测试了同样的行为,它们的行为完全相同。所以这显然不是一个版本的 MySQL 的问题。

我很难解释,但我附上了 2 个屏幕截图,它们会更好地告诉你哪里更好。

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

表结构

这里显示了正在执行的 SQL 查询,您可以在其中看到,第一次更新是正确的,第二次在“invoice_number”列中无缘无故地产生“0”值:

在此处输入图像描述

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

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

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

在此处输入图像描述

4

2 回答 2

2

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

单引号的问题是转移注意力(即分心)。即使 '55' 的解释与 55 不同,它在where语句中的解释方式也会相同。此外,“35”有效,但“30”无效。

一个关键的见解是删除引号时的失败。该声明:

update i_orders
    set invoice_number = 30
    where id = 55

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

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

于 2012-11-20T15:17:23.587 回答
0

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

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

两天的生命就在这样一个“隐形”上度过……

于 2012-11-21T12:42:29.273 回答