当前位置: 首页 > news >正文

MySQL对NULL值处理

在使用数据库时,有时需要表示未知值,这时可以使用NULL值表示。引入NULL值后,会对原有的使用产生影响,这里记录下常见的场景,以做记录。

NULL含义

在MySQL中,NULL值表示一个未知值,表示不可知、不确定。NULL值不同于0或空字符串’'。NULL不与任何值相等,即使是其本身。

NULL的存储

表中的某些列可能会存储 NULL 值,如果把这些 NULL 值都放到记录的真实数据中会比较浪费空间。MySQL 使用Compact Row Format记录NULL值。具体来说,Compact Row Format 中每个行记录都会有一个Bit vector来记录行中出现NULL的字段,长度为 N / 8 向上取整,其中 N为值NULL的字段数。
二进制位的值为1时,代表该列的值为NULL。
二进制位的值为0时,代表该列的值不为NULL。

NULL使用场景

NULL的比较

NULL不与任何值相等,即使是其本身。如果将NULL值与另一个NULL值或任何其他值进行比较,则结果为NULL。
为了实现对NULL的比较,MySQL提供了三大运算符:
(1) IS NULL: 当列的值是 NULL,此运算符返回 true。
(2) IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
(3) <=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。
注意,不能使用 = NULL 或 != NULL 在列中查找 NULL 值。

NULL与SELECT

执行SELECT操作时,如果列的值为NULL,可以使用 IS NULL、IS NOT NULL、<=> 运算符。

NULL与COUNT

执行COUNT操作时,如果使用COUNT(column_name)统计行数,需要注意列值为空的情况。如果column_name是非主键字段,那么只会统计列值为NULL的行数,需要说明的是,就这种情况下,不管在 InnoDB 引擎 还是在 MyISAM引擎中,非主键这个字段如果添加了索引且覆盖该字段,则可基于索引统计行数,如果未添加索引,则会触发全表扫描。
更多COUNT函数的使用可以参考笔者MySQL中count(*)和count(1)和count(column)使用比较一文。

NULL与数据运算

NULL值与其他值进行运算时,结果总是为NULL。且不同的运算符可能不能容忍NULL的场景,引入空指针问题等。

NULL与索引

MySQL中某一列数据含有NULL时,并不一定会造成索引失效。在有NULL值的字段上使用常用的索引,如普通索引、复合索引、全文索引等不会使索引失效。但是在使用空间索引的情况下,该列就必须为 NOT NULL。

NULL与排序

在使用ORDER BY排序的时候,如果是升序排序(ASC),那么 NULL 值在所有其他值之前;如果是降序排序(DESC),那么 NULL 值在所有其他值之后。注意,这种处理并不是说明NULL值比任何值大或小,只是一种约定。

总结

在MySQL中,引入NULL值表示表示一个未知值,表示不可知、不确定。尽管提供了NULL值,但是在日常开发中,不建议使用NULL值,建议为其设置默认值,如空字符串或 0 等。如果必须使用NULL,对于判空的场景,可以使用IS NULL或 IS NOT NULL或<=>。如果需要统计行数,需要注意COUNT(column_name)不能统计非NULL的值。如果需要执行计算,也要注意NULL与任何值进行运算时,其结果均为NULL,且可能引入空指针的问题。此外,引入NULL值后,还需注意索引是否会失效,如在空间索引中,列值必须为 NOT NULL。在使用ORDER BY排序时,如果是升序排序,那么 NULL 值在所有其他值之前;如果是降序排序(DESC),那么 NULL 值在所有其他值之后。
简言之,数据库需要对 NULL 值进行特殊处理,针对 NULL 的值使用,有以下建议:
【建议】不推荐使用NULL值,建议为其设置默认值。
【建议】推荐使用 IS NULL(cloumn) 来判断 NULL值。

参考

https://zhuanlan.zhihu.com/p/140089695 MySQL:细说NULL
https://www.runoob.com/mysql/mysql-null.html MySQL NULL 值处理
https://www.yiibai.com/mysql/null.html MySQL NULL值简介
https://zhuanlan.zhihu.com/p/611947091 MySQL允许字段为null会导致5个问题,个个致命!
https://www.cnblogs.com/xiaolincoding/p/16941244.html MySQL 的 NULL 值是怎么存储的?
https://juejin.cn/post/7028203652099604516 深入探究MySQL中的NULL
《Java开发手册》 阿里巴巴

http://www.lryc.cn/news/147986.html

相关文章:

  • Vector 动态数组(迭代器)
  • 多组背包恰好装满方案数
  • Oracle查询语句中做日期加减运算
  • Unity贝塞尔曲线的落地应用-驱动飞行特效
  • VTK——设置交互样式上的鼠标回调函数
  • Flutter实现动画列表AnimateListView
  • 【LeetCode-中等题】236. 二叉树的最近公共祖先
  • 如何拼接两个视频在一起?
  • Programming abstractions in C阅读笔记:p130-p131
  • 如何在Windows本地快速搭建SFTP文件服务器,并通过端口映射实现公网远程访问
  • C#---第二十:不同类型方法的执行顺序(new / virtual / common / override)
  • lnmp架构-PHP
  • 【javascript实操记录】
  • Mysql--技术文档--悲观锁、乐观锁-《控制并发机制简单认知、深度理解》
  • 【GO】LGTM_Grafana_Tempo(2)_官方用例改后实操
  • git 口令
  • 【回眸】剑指offer(二)解题思路
  • Python 基本文件操作及os库
  • YOLOv5算法改进(9)— 替换主干网络之ShuffleNetV2
  • 三、mycat分库分表
  • gitlab提交项目Log in with Access Token错误
  • openGauss学习笔记-56 openGauss 高级特性-DCF
  • Xcode 14 pod init报错
  • 飞腾PSPA可信启动--2 数字签名证书
  • 微前端:重塑大型项目的前沿技术
  • 官方推荐使用的OkHttp4网络请求库全面解析(Android篇)
  • Spooling的原理
  • Homebrew 无法安装过时的PHP版本
  • python爬取bilibili,下载视频
  • java八股文面试[多线程]——进程与线程的区别