背景:
设置了一个用户表 talent 列有学历ID、学历、姓名,请问我的学历ID是设置 int not null default 0 合适呢还是 int default null 合适呢?
参考:
《高性能MySQL》 - 尽量避免使用null:
a. 可为null值的列使得索引更加复杂,因为可为 null 值的列被索引,每个索引记录需要一个额外的字节 -- 我们不关注,多一个就多一个不差那点内存
b. 可为 null 值的列的值比较更为复杂,因为null值只能通过 is null 获取,对于 != 1 之类,null值也无法获取
理解:我们本能的认为 null != 1 返回的是 true,所以我们 column != 1应该能获取到 column is null 的行记录才对,但是事实上:
MySQL 执行 select if(null != 1,'true','false'); 返回值是 false ; 也就是说 在MySQL之中与任何值的比较(即使是null)永远都不会为“真” - 《MySQL DBA修炼之道》
c 使用聚合函数时候,count,min,sum将忽略null值 ,例如
select count(degree_id) from user; //如果有一行的degreee_id为null那么将不会计算这一行进去 select count(*) from user;//这个则直接计数行为不是单独的列值
所以对于总数的计数不能依赖于一列可以为 null 的列
d 对于timestamp的列,如果插入null值将会插入当前日期和时间;
e 对于auto_increment的列插入null值将会插入序列中的下一个编号;
其实以上,我们总结不用 null 的最大原因还是:值比较变得麻烦
例子:
1 查找不方便,比如我们想查找非本科学历(ID 值为5)的候选人,
select id,chnname,highdegree_id,highdegree_name from zp_talent where highdegree_id != 5 and id=460;
对于未填写学历的人比如 null 值我们无法获取,只能通过 is null 获取
但是本人使用 element ui开发,下拉框组件看到值为 0 的时候,会显示一个 0 值在输入框里面,显得很奇怪 ,所以我需要人工转一道:如果学历ID为0就转为空字符串;
而 default null 却不会有这样的烦恼;