NULL占用空间
mysql> select length(NULL), length(''), length('1');
+--------------+------------+-------------+
| length(NULL) | length('') | length('1') |
+--------------+------------+-------------+
| NULL | 0 | 1 |
+--------------+------------+-------------+
可以看出空值''的长度是0,是不占用空间的;而的NULL长度是NULL,是需要占用额外空间的,所以在一些开发规范中,建议将数据库字段设置为Not NULL,并且设置默认值''或0。
NULL对索引的影响
首先需要注意的一点是,MySQL中某一列数据含有NULL,并不一定会造成索引失效。
MySQL可以在含有NULL的列上使用索引
在有NULL值得字段上使用常用的索引,如普通索引(NORMAL)、复合索引、全文索引(FULLTEXT)、唯一索引(UNIQUE)等不会使索引失效。但是在使用空间索引(SPATIAL)的情况下,该列就必须为 NOT NULL。
NULL对排序的影响
在ORDER BY排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的
如果我们需要在正序排序时,将NULL值放在后边,这里我们就需要巧借IS NULL
select * from t_user order by age is null, age;
或者
select * from t_user order by isnull(name), age;
# 等价于
select * from (select name, age, (age is null) as isnull from t_user) as foo order by isnull, age;
MySQL NULL 的用法约定
1、如果业务上要求必须有值的,就 NOT NULL
2、如果是字符串类型的,也尽量 NOT NULL,没有值时可以用空字符串 '' 表示
3、业务上没有值,或者 是稀疏有值的字段(也就是大多数情况是 NULL,少数情况有值的),可以设为 NULL
4、如果要将 NULL 列作为查询条件,且 期望的查询结果同时包含 NULL值 + 有值 两种情况的,则最好定义为 NOT NULL(默认值可为 "" 或 0 )。
参考:
https://www.cnblogs.com/xiaolincoding/p/16941244.html
深入探究MySQL中的NULL - 掘金