在我们公司,我们将Web应用程序(LAMP)从一台服务器(Ubuntu 10.04)移动到一台新服务器(Ubuntu 12.04.2)。现在我们遇到了一个我以前从未见过的奇怪行为,我真的不知道从哪里开始。也许有人可以给我提示。
我们有以下简单的表格:
id data1 data2 data3
(int) (varchar) (int) (int)
-------------------------------------
1 (empty) 123 456
2 (null) 321 654
3 abc 555 666
(空)表示该字段包含空字符串。 (null)表示该字段为空。现在我们使用以下非常简单的查询:
SELECT * FROM `table` WHERE `data1` != 'abc';
在我们的旧服务器上,查询返回带有ID 1和2的行,我猜这是绝对正确的,因为!='abc'
匹配这两个记录集。
在我们的新服务器上,查询只返回id为1的记录集。查询突然忽略了选择字段中包含null的记录集。
只是为了说明一点:我知道可以使用IS NULL
,但这会导致检查应用程序中符合这种情况的所有查询和表。
现在的问题是:
我们的旧服务器上是否有运气,通过返回第1行和第2行,查询的行为符合预期,或者只返回第1行,新服务器的行为是否正确?
通常:!='abc'
应该与记录集1和2匹配,还是应该只匹配id 1?
是否有可能在mysql配置中有一个控制该行为的设置?我对此感到有点困惑。感谢每一位帮助!
提前致谢...
答案 0 :(得分:4)
因为null是一种特殊情况,如果要包含空值,则应明确指定它们是否需要它们。
SELECT * FROM table
WHERE(data1
<>'abc'或数据为空)
The right server behavior, is ignore nulls unless you ask for them...
答案 1 :(得分:0)
SELECT * FROM `table` WHERE `data1` = '';