CDA数据分析师:数据科学、人工智能从业者的在线大学。
数据科学(Python/R/Julia)数据分析、机器学习、深度学习 Q群:874447702
做一个积极的人
编码、改bug、提升自己
我有一个乐园,面向编程,春暖花开!
01 小木的故事
作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值。那你知道它们有什么区别吗?
学不动了,也不想知道它们有什么区别。大兄弟,不行啊,要面试!
前些天我的好朋友小木去应聘工作,他面试完回来和我聊天回味了一道他的面试题。
面试官:你有用过MySQL吗?
小木:有!
面试官:那你能大概说一下Mysql中 NULL值和空值的区别吗?
小木:(思考…)NULL和空值都用过,你要我说它两有啥区别,这个我还真没仔细想过,反正实际开发中会用!
听了小木的这个回答。
我说:你这样回答肯定是不妥的,这个问题你是必挂了。
小木说: NULL翻译过来不就是空吗?我是真的没有仔细想过,这个还是挺迷惑人的。
为了其他的伙伴在遇到这个问题的时候不要像我的好友小木一样在此处跌倒,错过心仪的公司,下面简单整理聊聊这两者的一些区别和使用。
02 NULL和空值
NULL也就是在字段中存储NULL值,空值也就是字段中存储空字符('')。
1、占用空间区别
mysql> select length(NULL), length(''), length('1');
+--------------+------------+-------------+| length(NULL) | length('') | length('1') |
+--------------+------------+-------------+1 row in set
小总结:从上面看出空值('')的长度是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` ( `one` varchar(10) NOT NULL, `two` varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入进行验证:
-- 全部插入 NULL,失败mysql> INSERT tb_test VALUES (NULL,NULL);
1048 - Column 'one' cannot be null
-- 全部插入 空值,成功mysql> INSERT tb_test VALUES ('','');
Query OK, 1 row affected
模拟数据:
INSERT tb_test VALUES (1,NULL);INSERT tb_test VALUES ('',2);INSERT tb_test VALUES (3,3);
空值字段:
-- 使用 is null/is not nullmysql> SELECT * FROM tb_test where one is NULL;
Empty setmysql> SELECT * FROM tb_test where one is not NULL;
+-----+------+3 rows in set-- 使用 = 、!=mysql> SELECT * FROM tb_test where one = '';
+-----+-----+1 row in setmysql> SELECT * FROM tb_test where one != '';
+-----+------+2 rows in set
NULL值字段:
-- 使用 is null/is not nullmysql> SELECT * FROM tb_test where two is not NULL;
+-----+-----+2 rows in setmysql> SELECT * FROM tb_test where two is NULL;
+-----+------+1 row in set-- 使用 = 、!=mysql> SELECT * FROM tb_test where two = '';
Empty setmysql> SELECT * FROM tb_test where two != '';
+-----+-----+2 rows in set
小总结:如果要单纯查NULL值列,则使用 is NULL去查,单纯去查空值('')列,则使用 =''。
建议查询方式:NULL值查询使用is null/is not null查询,而空值('')可以使用=或者!=、<、>等算术运算符。