MySQL为什么不推荐使用null值

一 总结结论

不推荐在任何环境使用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标识位占用长度)

  1. 两个字符串拼接, 如果包含null值, 则返回结果为null.
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来代替), 能极大的提升代码的可读性和可维护性,并避免上面的问题.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值