2

在我们公司,我们将 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

(empty) 表示该字段包含一个空字符串。(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配置中是否有可能控制该行为?我对此有点坚持。每一个帮助表示赞赏!

提前致谢...

4

2 回答 2

4

因为 null 是一种特殊情况,所以如果您想要包含 null 值,您应该明确指定您想要它们。

SELECT * FROM tableWHERE ( data1<> 'abc' 或data1为空)

除非您要求它们,否则预期的服务器行为是忽略空值...

于 2013-06-13T22:02:50.433 回答
0
SELECT * FROM `table` WHERE `data1` = '';
于 2016-03-17T06:28:07.623 回答