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。



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
存储 关系型数据库 MySQL
mysql 使用变量存储中间结果的写法
mysql 使用变量存储中间结果的写法
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
2509 57
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
存储 关系型数据库 MySQL
【免费动手教程上线】阿里云RDS MySQL推出大容量高性能存储:高性能本地盘(最高16TB存储空间)、高性能云盘(最高64TB存储空间)
阿里云RDS MySQL提供高性能本地盘与高性能云盘等存储方案,满足用户大容量、低延迟需求。高性能本地盘单盘最大16TB,IO延时微秒级;高性能云盘兼容ESSD特性,支持IO性能突发、BPE及16K原子写等能力。此外,阿里云还提供免费动手体验教程,帮助用户直观感受云数据库 RDS 存储性能表现。
|
存储 算法 关系型数据库
InnoDB与MyISAM实现索引方式的区别?
首先两者都是用的是B+树索引,但二者的实现方式不同。 对于主键索引,InnoDB中叶子节点保存了完整的数据记录,而MyISAM中索引文件与数据文件是分离的,叶子节点上的索引文件仅保存了数据记录的地址. 对于辅助索引,InnoDB中辅助索引会对主键进行存储,查找时,先通过辅助索引的B+树在叶子节点获取对应的主键,然后使用主键在主索引B+树上检索操作,最终得到行数据;MyISAM中要求主索引是唯一的,而辅助索引可以是重复的,主索引与辅助索引没有任何区别,因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址
|
存储 关系型数据库 MySQL
MySQL进阶突击系列(09)数据磁盘存储模型 | 一行数据怎么存?
文中详细介绍了MySQL数据库中一行数据在磁盘上的存储机制,包括表空间、段、区、页和行的具体结构,以及如何设计和优化行数据存储以提高性能。
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
419 9
|
安全 关系型数据库 数据库
MyISAM和InnoDB的区别
InnoDB支持事务,MyISAM不支持 InnoDB支持外键,MyISAM不支持 InnoDB是聚簇索引,MyISAM是非聚簇索引 InnoDB支持行锁和表锁,MyISAM只支持表锁;【并发情况下,InnoDB性能更牛,默认一锁只会锁住一行数据】 InnoDB不支持全文索引,MyISAM支持 InnoDB支持自增和MVCC模式的读写,MyISAM不支持 InnoDB支持支出数据库异常崩溃后的安全恢复,MyISAM不支持【崩溃后,重启会保证数据恢复到崩溃前状态。这个恢复的过程依赖于redo.log】
|
存储 算法 关系型数据库
InnoDB与MyISAM实现索引方式的区别
InnoDB和MyISAM均采用B+树索引,但在实现上有所不同。InnoDB的主键索引在叶子节点存储完整数据记录,辅助索引则存储主键值;而MyISAM的主键索引与数据文件分离,仅存数据地址,且主辅索引无区别,支持非唯一主索引。
347 1
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
558 2

推荐镜像

更多