MySQL中'' ' ' NULL在Innodb存储的区别

简介: MySQL中'' ' ' NULL在Innodb存储的区别

一、测试环境

  1. mysql> create table testn(a varchar(20),b varchar(20));
  2. Query OK, 0 rows affected (0.43 sec)

  3. mysql> insert into testn values('','gaopeng');
  4. Query OK, 1 row affected (0.08 sec)

  5. mysql> insert into testn values(' ','gaopeng');
  6. Query OK, 1 row affected (0.12 sec)

  7. mysql> insert into testn values(NULL,'gaopeng');
  8. Query OK, 1 row affected (0.08 sec)

  9. mysql> commit;
  10. Query OK, 0 rows affected (0.00 sec)

我们看到包含了3行,包含了3种情况,下面我们分别分析。


二、解析

  1. 第一行 insert into testn values('','gaopeng');

原始存储如下:

  1. 070000000010002200000014061c000000002fe5bb0000016e011067616f70656e67
  • 07:第2个字段可变长度7
  • 00第1个字段可变长度0
  • 00NULL位图 没有NULL字段
  • 0000100022:5字节固定
  • 00000014061cROWID
  • 000000002fe5TRX ID
  • bb0000016e0110ROLL PTR
  • 第一个字段没有存储 字符''
  • 67616f70656e67 第二个字段 'gaopeng'
  1. 第二行:insert into testn values(' ','gaopeng');

原始存储如下:

  1. 070100000018002200000014061d000000002fe6bc0000017901102067616f70656e67
  • 07第2个字段可变长度7
  • 01第1个字段可变长度1
  • 00NULL位图 没有NULL字段
  • 00001800225字节固定
  • 00000014061dROWID
  • 000000002fe6TRX ID
  • bc000001790110ROLL PTR
  • 20空字符' '
  • 67616f70656e67第二个字段 'gaopeng'

原始存储如下:


  • 07:第2个字段可变长度7
  • 01:NULL位图为为00000001 表示第一个字段为NULL
  • 000020ffac5字节固定
  • 00000014061eROWID
  • 000000002febTRX ID
  • bf0000017c0110ROLL PTR
  • 第一个字段NULL
  • 67616f70656e67第二个字段 'gaopeng'

三、总结

  • ''不做存储,但是会记录可变长度的长度为0,NULL位图本位为0。
  • NULL不做实际存储,也不会记录可变长度,但是NULL位图本位为1。
  • ' ' 做存储为0X20,记录可变长度为01,NULL位图本位为0。



            </div>
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
JavaScript 前端开发
JavaScript实现11位手机号码正则表达式
JavaScript实现11位手机号码正则表达式
527 0
|
编解码
LabVIEW条形码识别(实战篇—5)
LabVIEW条形码识别(实战篇—5)
LabVIEW条形码识别(实战篇—5)
|
5月前
|
移动开发 前端开发 开发者
《画布角色的双重灵魂:解析Canvas小游戏中动画与碰撞的共生逻辑》
本文深入探讨HTML5 Canvas小游戏中角色动画与碰撞检测的深层构建逻辑。角色动画通过关键帧拆解、分层设计及动态参数调整,让像素模拟出富有韵律的生命运动,如拆分角色部位实现差异化动作、依据状态改变动画速度。碰撞检测则通过构建碰撞体、空间分区及层级检测,精准判断角色空间关系,结合反馈设计传递碰撞的力度与意义。二者协同工作,动画响应碰撞结果调整姿态,碰撞检测依据动画状态动态适配,在时间与空间的把控中,让虚拟角色拥有真实交互感,为开发者提供从技术实现到体验优化的深层思路。
139 7
|
8月前
|
Ubuntu Linux
Ubuntu中dpkg和apt命令:debian包安装详解
希望这让你对于Ubuntu中的dpkg和apt命令有了更为清晰的理解。下次你面对软件包安装的问题,就可以轻松应对,优雅地在你的Linux系统中游刃有余了。
881 10
|
12月前
|
数据可视化 项目管理
提升团队沟通协作:ORID聚焦式会话法应用技巧
ORID(Objective, Reflective, Interpretive, Decisional)是一种结构化的讨论方法,能帮助团队成员全面了解问题,在讨论中达成共识,并做出高效决策。
527 5
提升团队沟通协作:ORID聚焦式会话法应用技巧
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
447 6
常用工具类-Objects
本文介绍了Java标准库中的Objects工具类,它提供了一系列用于操作对象的实用方法,包括判断对象是否为空、比较两个对象是否相等、比较两个对象以及判断两个数组是否深度相等。文章通过示例代码展示了Objects类中isNull、nonNull、requireNull、equals、compare和deepEquals等方法的使用,突出了Objects类在处理对象时的便利性和实用性。
常用工具类-Objects
|
传感器 数据安全/隐私保护 网络架构
认识 IBSS 和 BSS
【8月更文挑战第24天】
1325 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的校园二手交易平台系统的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的校园二手交易平台系统的详细设计和实现
260 1
|
Ubuntu Shell Linux
Python环境搭建
Python环境搭建
983 1