共计 2996 个字符,预计需要花费 8 分钟才能阅读完成。
Author:3# 一个专一于 web 技术的 80 后
我不必拼过聪明人,我只须要拼过那些懒人 我就肯定会超过大部分人!
CSDN@ 极客小俊,CSDN 官网首发,`3# 原创
企业博客:???? 极客小俊 GeekerJun ????
博客园 Blog: ???? cnblogs.com/GeekerJun ????
浅谈 NULL 和 空值的区别
NULL 也就是在字段中存储 NULL 值
空字符串值也就是字段中存储空字符(”)
咱们来通过测试来看看 他们彼此的区别:
1、占用空间区别
mysql> select length(NULL), length(''), length('1');
+--------------+------------+-------------+
| length(NULL) | length('') | length('1') |
+--------------+------------+-------------+
| NULL | 0 | 1 |
+--------------+------------+-------------+
1 row in set (0.03 sec)
== 小结 == : 从下面的测试能够看出 字符串空值 (”) 的长度是 0,是不占用空间的, 而的 NULL 长度是 NULL,其实它是占用空间的!
NULL columns require additional space in the row to record whether their values are NULL.
意思是: NULL 列须要行中的额定空间来记录它们的值是否为 NULL
艰深意义上讲: ('')字符串空值就像是一个真空转态杯子,什么都没有,而 NULL 值就是一个装满空气的杯子,尽管看起来都是一样的,然而有着实质的区别
2、插入方式区别
# 创立一个表,tb_test
create table tb_test(
id int unsigned primary key auto_increment,
one varchar(10) NOT NULL,
two varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入进行验证:#全副插入 NULL,会失败 起因就是指定的不容许插入 NULL
insert into tb_test(one,two) value (NULL,NULL);
1048 - Column 'one' cannot be null
#全副插入 空字符串值,胜利 起因就是 ('') 字符 和 NULL 的类型都不一样 指定的是不容许插入 NULL, 又没有说不容许 ('') 空字符串!^.^
insert into tb_test(one,two) value ('','');
Query OK, 1 row affected
#这也是刚刚讲过 not null 束缚测试 insert 语句的时候, 插入 ('') 空字符串会胜利的起因!
3、在查问形式上的区别比照
# 创立一个表,tb_test2
create table tb_test2(
id int unsigned primary key auto_increment,
one varchar(10) NOT NULL,
two varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#模仿数据:insert into tb_test2(one,two) values (1,NULL);
insert into tb_test2(one,two) values ('',2);
insert into tb_test2(one,two) values (3,3);
#查问 one 字段
#应用 is null 来查问 one 字段
select * FROM tb_test2 where one is null; #后果就是一条也没有,因为 one 字段并没有代表为 NULL 的数据存在!
#应用 is not null 来查问 one 字段
select * FROM tb_test2 where one is not null; #后果被全副查问进去, 因为 one 字段中的三个数据都不为 NULL 这个类型
#应用 = 和 != 来查问 one 字段
select * FROM tb_test2 where one ='';
select * FROM tb_test2 where one != '';
#查问 two 字段
#应用 is null 来查问 two 字段
select * FROM tb_test2 where two is null; #后果有一条合乎 NULL,
#应用 is not null 来查问 two 字段
select * FROM tb_test2 where two is not null; #后果是不合乎 NULL 的有两条
#应用 = 来查问 two 字段
select * FROM tb_test2 where two ='';
#应用 != 来查问 two 字段
#这里要留神的是为 NULL 的并没有查问进去, 起因用 != 来查 字符串空 ('') 的时候, 会把 NULL 也当做是字符串空来判断吧!
select * FROM tb_test2 where two != '';
== 小结:== 如果要单纯查 NULL 值列,则应用 is NULL
去查,单纯去查空值 (”) 列,则应用 =''
。
倡议查问形式:NULL 值查问应用 is null/is not null 查问,而空值 (”) 能够应用 = 或者!=、<、> 等算术运算符来查!
4、在 count()统计函数上的区别
# 创立一个表,tb_test3
create table tb_test3(
id int unsigned primary key auto_increment,
one varchar(10) NOT NULL,
two varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#模仿数据:insert into tb_test3(one,two) values (1,NULL);
insert into tb_test3(one,two) values ('',2);
insert into tb_test3(one,two) values (3,3);
#应用 COUNT 函数统计 one 字段:
select count(one) from tb_test3; #后果为: 3 条,阐明 空字符串 ('') 会被 count() 函数统计!
#应用 COUNT 函数统计 two 字段:
select count(two) from tb_test3; #后果为: 2 条, 起因是 NULL 不会被 count()函数统计到!
#留神: 应用 * 号来统计会把 NULL 算进去!
SELECT count(*) FROM tb_test;
+----------+
| count(*) |
+----------+
| 3 |
+----------+
== 理论开发到底是应用 NULL 值还是空值 (”) 呢?==
依据理论业务来进行辨别, 集体倡议在理论开发中如果没有非凡的业务场景,能够间接应用空字符串值(”) !
如果我的博客对你有帮忙、如果你喜爱我的博客内容,请 “点赞” “评论”“珍藏”
一键三连哦!
据说 ???? 点赞
???? 的人运气不会太差,每一天都会元气满满哦 嘿嘿!!! ❤️ ❤️ ❤️
大家的反对就是我坚持下去的能源。点赞后不要忘了???? 关注 ???? 我哦!
更多精彩内容请返回 CSDN 极客小俊 GeekerJun 的博客 或 小俊的博客园、
也能够百度搜寻关键字 :???? > 极客小俊
???? 进行关注哦
如果以上内容有任何谬误或者不精确的中央,欢送在上面 ???? 留个言指出、或者你有更好的想法,欢送一起交流学习~~~
欢送退出咱们技术交换群: