MySQL 的 NULL 值是怎么存储的?

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 - 掘金

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值