针对值的Mysql测试排除了NULL条目 - 有人可以解释一下吗?

时间:2011-11-10 06:35:48

标签: mysql null

我有一个table shop_categories,其中包含一个名为category_is_hidden的字段,定义为:

category_is_hidden tinyint(4) DEFAULT NULL

在数据库中,该字段的值为1或NULL。

SELECT * FROM shop_categories where category_is_hidden IS NULL

返回所有空条目。

SELECT * FROM shop_categories where category_is_hidden <> 1

返回一个空集(也就是说,它排除了空值)。

为什么最后一个语句不包含空条目?不是null&lt;&gt; 1?

编辑:测试MySQL 5.1&amp; 5.5

2 个答案:

答案 0 :(得分:7)

由于您的category_is_hidden列似乎是一个标志,我将其更改为tinyint(1)并使其为1或0而不是1或NULL。允许列为null将在列的存储要求中添加一个字节,从而导致索引大小增加。

接下来,您实际问的问题。根据定义,NULL为UNKNOWN。您的查询说“给我category_is_hidden不是1的所有内容”。但是NULL列值都是未知的。所以MySQL不知道它们是不是1.你需要将WHERE重写为IS NOT NULL。如果你的列将是三态(1,NULL,其他值),你需要让你的WHERE中有一个OR来允许它。

答案 1 :(得分:3)

如果字段为空,则表示它没有值。它不是零,也不是空字符串。如果你检查NULL&lt;&gt; 1,那不是,因为它不是数字;它不是什么,因此无法比较。