我有一个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
答案 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,那不是,因为它不是数字;它不是什么,因此无法比较。