假设 MySQL 中某数据表 code 字段是可为 NULL

1
2
... AND code NOT IN () ...
... AND (code IS NULL or code NOT IN()) ...

是不一样的,第一个查不出 code IS NULL 的数据。

https://stackoverflow.com/questions/3536670/mysql-selecting-rows-where-a-column-is-null

SQL NULL’s special, and you have to do WHERE field IS NULL, as NULL cannot be equal to anything,

including itself (ie: NULL = NULL is always false).

See Rule 3 https://en.wikipedia.org/wiki/Codd%27s_12_rules

几个不用 NULL 的理由:

1.NULL 和 “” 不相同,比如查询 code != ‘xx’ 的记录并不包含 NULL 的,必须加一个条件 and is null. 容易遗漏。

2.Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,还能导致MYisam 中固定大小的索引变成可变大小的索引。

—— 出自《高性能mysql第二版》

因此建议除了 timestamps 这种字段,都用 NOT NULL DEFAULT ” 表示。

关于 NULL 和唯一索引,唯一性索引是允许多个 NULL 值的存在的。