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

Ben*_*Ben 4 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
Run Code Online (Sandbox Code Playgroud)

返回所有空条目.

SELECT * FROM shop_categories where category_is_hidden <> 1
Run Code Online (Sandbox Code Playgroud)

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

为什么最后一个语句不包含空条目?不是<> 1?

编辑:在MySQL 5.1和5.5上测试

Vic*_*Vic 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来允许它.