MySQL字段到底推不推荐使用null值
一 总结结论
不推荐在任何环境使用null值填充字段
二 原因分析
为什么会有人使用
- 创建数据库时, 为了以后数据插入方便, 省去中间的校验过程, 方便快捷, 总结就是 图省事.
- 创建默认表时sql语句不规范, 使用默认参数, 总结就是 能力不足.
- 项目数据迁移时为了在数据层面兼容老数据(项目中实际遇到).
不推荐理由
- 从代码编写角度分许, 数据插入的时候, 的确可以带来方便, 但是在读取数据的时候, 会带来大量的数据非空检查, 否则抛出NullPointException.
- 从数据库字段长度占用角度分析, 相同长度字段, null 比 非null 存储空间长度占用多1个字节, 因为需要一个额外字段判断是否是null值.
- 从sql语句查询角度分析, null值列和其他列进行操作可能引发错误.
理由佐证
- 理由1不需要佐证
- 首先新建环境, sql语句如下
create table nulltesttable( id int primary key, name_not_null varchar(10) not null, name_null varchar(10) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; alter table nulltesttable add index idx_nulltesttable_name_not_null(name_not_null); alter table nulltesttable add index idx_nulltesttable_name_null(name_null);
explain select * from nulltesttable where name_not_null=’name’; // explain1
explain select * from nulltesttable where name_null=’name’; // explain2
从sql 执行可以看出, explain1中 key_len = 32, explain2中 key_len = 33
explain1的32 由来: 10(字段长度) * 3(utf8字符编码占用长度) + 2(varchar标识为变长占用长度)
explain2的32 由来: 10(字段长度) * 3(utf8字符编码占用长度) + 2(varchar标识为变长占用长度) + 1(null标识位占用长度)
3. 两个字符串拼接, 如果包含null值, 则返回结果为null.
```sql
insert into nulltesttable(id,name_not_null,name_null) values(1,'one',null);
insert into nulltesttable(id,name_not_null,name_null) values(2,'two','three');
select concat(name_not_null,name_null) from nulltesttable where id = 1; -- out: null
select concat(name_not_null,name_null) from nulltesttable where id = 2; -- out: twothree
- 如果字段允许null值, 且这个字段被索引. 如下的查询可能会返回不正确的结果
select * from nulltesttable where name_null <> 'three' -- out: null select count(name_null) from nulltesttable -- out: 1
三 使用建议
- 数据库中null值字段, null值使用一个意义字符来代替(大部分可以使用””或者0来代替), 能极大的提升代码的可读性和可维护性,并避免上面的问题.
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 zhao4xi@126.com
文章标题:MySQL字段到底推不推荐使用null值
文章字数:602
本文作者:Zhaoxi
发布时间:2018-12-14, 14:59:38
最后更新:2019-09-21, 15:00:21
原始链接:http://zhao4xi.github.io/2018/12/14/MySQL字段到底推不推荐使用null值/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。