MySQL字段到底推不推荐使用null值

  1. 一 总结结论
  2. 二 原因分析
    1. 为什么会有人使用
    2. 不推荐理由
    3. 理由佐证
  3. 三 使用建议

一 总结结论

不推荐在任何环境使用null值填充字段

二 原因分析

为什么会有人使用

  1. 创建数据库时, 为了以后数据插入方便, 省去中间的校验过程, 方便快捷, 总结就是 图省事.
  2. 创建默认表时sql语句不规范, 使用默认参数, 总结就是 能力不足.
  3. 项目数据迁移时为了在数据层面兼容老数据(项目中实际遇到).

不推荐理由

  1. 从代码编写角度分许, 数据插入的时候, 的确可以带来方便, 但是在读取数据的时候, 会带来大量的数据非空检查, 否则抛出NullPointException.
  2. 从数据库字段长度占用角度分析, 相同长度字段, null 比 非null 存储空间长度占用多1个字节, 因为需要一个额外字段判断是否是null值.
  3. 从sql语句查询角度分析, null值列和其他列进行操作可能引发错误.

理由佐证

  1. 理由1不需要佐证
  2. 首先新建环境, 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
  1. 如果字段允许null值, 且这个字段被索引. 如下的查询可能会返回不正确的结果
    select * from nulltesttable where name_null <> 'three' -- out: null
    select count(name_null) from nulltesttable -- out: 1 

三 使用建议

  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" 转载请保留原文链接及作者。

目录