公司DBA强制字段设置not null,不明觉厉,看了一下网上的文章,整理如下
创建表
CREATE TABLE `test02` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`col1` varchar(255) NOT NULL,
`col2` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_col2` (`col2`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
col1不为null,col2默认为null,col2上定义了一个索引。
插入数据
insert into test02(col1,col2) values(“”,1)
insert into test02(col1,col2) values('2',null)
查询时直接用=判断
select * from test02 where col2=null
查询不出来col2为空的数据, n u l l 与 其 它 值 的 比 较 永 远 都 为 f a l s e 。 \color{#FF0000}{ null与其它值的比较永远都为false。} null与其它值的比较永远都为false。
count为null的列
select count(col2) from test02
得到的行数也不包括col2为空的那一列。col2为null的那条记录不会查出来, 为 n u l l 的 那 一 列 不 会 参 与 c o u n t 行 数 计 算 \color{#FF0000}{为null的那一列不会参与count行数计算} 为null的那一列不会参与count行数计算
判断null列是否走索引
explain
select * from test02 where col2 is null
col2定义了索引,where中用is null判断的时候用到了。
为
n
u
l
l
的
列
如
果
定
义
了
索
引
,
在
查
询
中
使
用
i
s
n
u
l
l
判
断
也
会
用
到
索
引
\color{#FF0000}{ 为null的列如果定义了索引,在查询中使用is null判断也会用到索引}
为null的列如果定义了索引,在查询中使用isnull判断也会用到索引
总结一下
定
义
为
n
u
l
l
的
列
在
w
h
e
r
e
中
判
断
时
直
接
用
=
为
存
在
问
题
,
n
u
l
l
与
任
何
值
判
断
都
为
f
a
l
s
e
,
\color{#FF0000}{定义为null 的列在where中判断时直接用=为存在问题,null与任何值判断都为false,}
定义为null的列在where中判断时直接用=为存在问题,null与任何值判断都为false,
并
且
c
o
u
n
t
为
n
u
l
l
的
列
也
会
存
在
行
数
计
算
异
常
。
如
果
用
i
s
n
u
l
l
判
断
是
不
会
有
问
题
的
,
\color{#FF0000}{并且count为null的列也会存在行数计算异常。如果用is null判断是不会有问题的,}
并且count为null的列也会存在行数计算异常。如果用isnull判断是不会有问题的,
如
果
定
义
了
索
引
,
也
会
用
到
索
引
的
\color{#FF0000}{如果定义了索引,也会用到索引的}
如果定义了索引,也会用到索引的
‘
’
和
n
u
l
l
的
区
别
在
于
,
‘
’
不
会
占
用
空
间
,
n
u
l
l
会
占
用
空
间
,
\color{#FF0000}{‘’和null的区别在于,‘’不会占用空间,null会占用空间,}
‘’和null的区别在于,‘’不会占用空间,null会占用空间,
就
像
有
一
个
杯
子
,
‘
’
是
真
空
的
,
n
u
l
l
是
装
了
空
气
的
\color{#FF0000}{就像有一个杯子,‘’是真空的,null是装了空气的}
就像有一个杯子,‘’是真空的,null是装了空气的
可 为 n u l l 的 列 会 占 用 更 多 的 存 储 空 间 。 \color{#FF0000}{ 可为null的列会占用更多的存储空间。} 可为null的列会占用更多的存储空间。
参考
https://www.cnblogs.com/sherlockwhite/p/why_not_null.html
http://www.zzvips.com/article/920.html
https://www.runoob.com/mysql/mysql-null.html
https://www.jianshu.com/p/0c909bf62bcd