做一个积极的人

编码、改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') |
+--------------+------------+-------------+
| NULL         |          0 |           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 null
mysql> SELECT * FROM tb_test where one is NULL;
Empty setmysql> SELECT * FROM tb_test where one is not NULL;
+-----+------+
| one | two  |
+-----+------+
| 1   | NULL |
|     | 2    |
| 3   | 3    |
+-----+------+
3 rows in set
-- 使用 = 、!=
mysql> SELECT * FROM tb_test where one = '';
+-----+-----+
| one | two |
+-----+-----+
|     | 2   |
+-----+-----+
1 row in setmysql> SELECT * FROM tb_test where one != '';
+-----+------+
| one | two  |
+-----+------+
| 1   | NULL |
| 3   | 3    |
+-----+------+
2 rows in set

NULL值字段:

-- 使用 is null/is not null
mysql> SELECT * FROM tb_test where two is not NULL;
+-----+-----+
| one | two |
+-----+-----+
|     | 2   |
| 3   | 3   |
+-----+-----+
2 rows in setmysql> SELECT * FROM tb_test where two is NULL;
+-----+------+
| one | two  |
+-----+------+
| 1   | NULL |
+-----+------+
1 row in set-- 使用 = 、!=
mysql> SELECT * FROM tb_test where two = '';
Empty setmysql> SELECT * FROM tb_test where two != '';
+-----+-----+
| one | two |
+-----+-----+
|     | 2   |
| 3   | 3   |
+-----+-----+
2 rows in set

小总结:如果要单纯查NULL值列,则使用 is NULL去查,单纯去查空值(’’)列,则使用 =''

建议查询方式:NULL值查询使用is null/is not null查询,而空值(’’)可以使用=或者!=、<、>等算术运算符。

3、COUNT 和 IFNULL函数

使用COUNT函数:

mysql> SELECT count(one) FROM tb_test;
+------------+
| count(one) |
+------------+
|          3 |
+------------+
1 row in setmysql> SELECT count(two) FROM tb_test;
+------------+
| count(two) |
+------------+
|          2 |
+------------+
1 row in setmysql> SELECT count(*) FROM tb_test;
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set

使用IFNULL函数:

mysql> SELECT IFNULL(one,111111111) from tb_test WHERE one = '';
+-----------------------+
| IFNULL(one,111111111) |
+-----------------------+
|                       |
+-----------------------+
1 row in setmysql> SELECT IFNULL(two,11111111) from tb_test where two is NULL;
+----------------------+
| IFNULL(two,11111111) |
+----------------------+
| 11111111             |
+----------------------+
1 row in set

小总结:使用 COUNT(字段) 统计会过滤掉 NULL 值,但是不会过滤掉空值。

说明:IFNULL有两个参数。 如果第一个参数字段不是NULL,则返回第一个字段的值。 否则,IFNULL函数返回第二个参数的值(默认值)。

4、索引字段说明

看到网上有一些人说: MySql中如果某一列中含有NULL,那么包含该列的索引就无效了。

onetwo 字段分别加上普通索引。之前有写过,在复习添加索引:Mysql索引整理总结

-- ALTER TABLE table_name ADD INDEX index_name(col_name);
ALTER TABLE tb_test ADD INDEX index_oat (one, two);
ALTER TABLE tb_test add INDEX index_two(two);

使用 show keys from 表名;show indexes from 表名; ,查看这个表的所有索引信息。

一个普通索引,一个复合索引。

复合索引遵守“最左前缀”原则即在查询条件中使用了复合索引的第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。

可以看到,创建了两个索引,并且index_tow NULL 那一列是 YES。

使用EXPLAIN 来进行演示说明,EXPLAIN 的使用说明:Mysql中explain用法和结果字段的含义介绍

复合索引

普通索引

发现查询two字段 是可以正常使用索引的。我使用的MYSQL 5.7 ,InnoDB 引擎。也看了一些网上的资料,MySQL中NULL对索引的影响 这个文章中用例子验证,MySQL可以在含有null的列上使用索引

备注:可能是其他条件下不行,看网上资料说使用空间索引会失效,具体我没有去验证,空间索引没有用到过。查询官网create-index-spatial,感兴趣的伙伴可以自行验证。

这里我想到一点,很多问题的答案都是在指定的条件和环境下才成立,多质疑,多验证。

小总结 :在有NULL值得字段上使用常用的索引,如普通索引、复合索引、全文索引等不会使索引失效。在官网查看在空间索引的情况下,说明了 索引列必须为NOT NULL。

03 总结提升

如果你可以从上面的几个方面和面试官进行一个沟通,即使回答的不是那么的完美,但总比 “这两个都用过,具体有啥区别就不知道了” 这样的回答能好那么一点点。

1、空值不占空间,NULL值占空间。当字段不为NULL时,也可以插入空值。

2、当使用 IS NOT NULL 或者 IS NULL 时,只能查出字段中没有不为NULL的或者为 NULL 的,不能查出空值。

3、判断NULL 用IS NULL 或者 is not null,SQL 语句函数中可以使用IFNULL()函数来进行处理,判断空字符用 =’‘或者<>’'来进行处理。

4、在进行count()统计某列的记录数的时候,如果采用的NULL值,会别系统自动忽略掉,但是空值是会进行统计到其中的。

5、MySql中如果某一列中含有NULL,那么包含该列的索引就无效了。这一句不是很准确。

6:实际到底是使用NULL值还是空值(’’),根据实际业务来进行区分。个人建议在实际开发中如果没有特殊的业务场景,可以直接使用空值。

以上就是我的对此问题的整理和思考,希望可以在面试中帮助到你。如果你对此话题有自己的思考和理解,也欢迎留言一起探讨!

04 参考资料

https://www.cnblogs.com/wzmenjoy/p/4244590.html

https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html


谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!


Java编程技术乐园:一个分享编程知识的公众号。跟着老司机一起学习干货技术知识,每天进步一点点,让小的积累,带来大的改变! 扫描关注,后台回复【资源】,获取珍藏干货! 99.9%的伙伴都很喜欢

© 每天都在变得更好的阿飞云

MySQL 中NULL和空值的区别?相关推荐

  1. MySQL 中NULL和空值的区别

    平时我们在使用MySQL的时候,对于MySQL中的NULL值和空值区别不能很好的理解.注意到NULL值是未知的,且占用空间,不走索引,DBA建议建表的时候最好设置字段是NOT NULL 来避免这种低效 ...

  2. mysql两个字段相减_MySQL 中NULL和空值的区别?

    作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值.那你知道它们有什么区别吗? 学不动了,也不想知道它们有什么区别.大兄弟,不行啊,要面试! 前些天我 ...

  3. db2中null和空值的区别_MySQL数据库的表中 NULL 和 空值 到底有什么区别呢?

    作者:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! 知乎@极客小俊,官方首发原创文章 浅谈 NULL 和 空值的区别 NULL也就是在字段中 ...

  4. db2中null和空值的区别_MySQL数据库的表中 NULL和空值 到底有什么区别呢?

    作者:极客小俊 一个专注于web技术的80后 你不用拼过聪明人,你只需要拼过那些懒人 你就一定会超越大部分人! NULL也就是在字段中存储NULL值 空字符串值也就是字段中存储空字符('') 我们来通 ...

  5. mysql''和null,mysql中NULL和null的区别

    接触php的web开发一段时间了,在进行数据库操作的时候经常会遇到一个问题,使得同一字段在页面显示时有3种类型NULL,null以及数字,当时的解决办法是将这一字段定义为varchar类型,在插入数据 ...

  6. insert into 插入空值_MySQL数据库的表中 NULL 和 空值 到底有什么区别呢

    浅谈 NULL 和 空值的区别 NULL也就是在字段中存储NULL值 空字符串值也就是字段中存储空字符('') 我们来通过测试来看看 他们彼此的区别: 1.占用空间区别 mysql> selec ...

  7. MySQL 中 NULL 导致唯一键失效

    最近遇到一个问题,我为一张表中创建了一个唯一键,并且键中字段为NULL,最终导致了唯一约束失效.这里做下分析: 首先新建一张表,包含 work_no,name,age 三个字段: DROP TABLE ...

  8. Mysql中的count()与sum()区别

    Mysql中的count()与sum()区别 首先创建个表说明问题 CREATE TABLE `result` ( `name` varchar(20) default NULL, `subject` ...

  9. MySQL中interactive_timeout和wait_timeout的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在用mysql客户端对数据库进行操作时,打开终端窗口,如果一段时间没有操作,再次操作时,常常会报如下错误: ? 1 2 3 E ...

最新文章

  1. 专访Niclas Hedhman:Apache欢迎什么样的开源项目?
  2. pytorch指定gpu
  3. 数据分析能力到底有多重要
  4. linux安装anaconda3提前so,Linux安装anaconda3
  5. Jira 的 数据库备份恢复 简单过程
  6. 是时候扔掉 Postman 了,Apifox 真香!
  7. 问题:如何将多个文件里内容都提取出来
  8. Mysql学习总结(2)——Mysql超详细Window安装教程
  9. Filecoin网络目前总质押量约为3314万枚FIL
  10. c++删除数组中重复元素_C / C ++中的数组
  11. python字符串操作方法_python字符串常用操作方法
  12. Atitit rss没落以及替代品在线阅读器
  13. ubuntu下安装tun模块图文详细教程
  14. 基于行为树的高级游戏AI教程
  15. 最适合晚上睡不着看的 7 个网站,建议收藏哦
  16. Matlab中dir使用中遇到的一些问题
  17. java.util.regex.PatternSyntaxException: Unclosed counted closure near index 14
  18. (电脑软件启动无法验证)win10专业版如何解决无法验证发布者
  19. 数字IC设计工程师笔试面试经典100题-有答案
  20. Race Condition漏洞

热门文章

  1. 我是AI工程师,却在猪厂做“美容”
  2. 一文彻底搞懂前端沙箱
  3. SDUT 简单枚举类型——植物与颜色
  4. 7种常见的51单片机时钟电路图,收藏!
  5. 电脑能玩和平精英吗_电脑玩和平精英模拟器灵敏度这样设置无延迟,还能匹配手机?...
  6. traffic_classification_utils使用文档
  7. win7 修复计算机要多久,系统修复,教您win7系统要怎么修复
  8. 如何搭建NFS--网络文件系统
  9. MacOs的环境变量配置
  10. 微信小程序退出登录取消授权