ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql innodb引擎中varchar和char的区别

2021-02-05 09:02:58  阅读:163  来源: 互联网

标签:00 01 varchar 字节 char innodb 变长 20 null


一. 行记录格式

innodb在存储数据的时候是以行的形式存储的,版本相关,并且有固定的格式。可以通过下面的语句查询当前所用版本的行记录格式:

show table status like '表名';

在版本5.6中默认使用格式是Compact,而在8.0中默认的格式是Dynamic。本文描述的是Compact格式下的行记录。版本查询可以使用语句‘select version();’。

Compact格式是5.0引入的,目的是为了高效存储数据。其存储方式如下:

变长字段长度列表

NULL标志位

记录头信息

列1数据

列2数据

...

 

 

 

1、变长字段长度列表,注意断句为变长字段-长度-列表。

  a) 其描述了行记录中存储内容长度不固定的字段所占用的字节数

  b) 按照列的顺序逆序存放

  c) 若列的长度小于255个字节,则用一个字节描述

  d) 若列的长度大于255个字节,则用两个字节描述

  e) 变长字段的长度不能大于65535个字节,所以,最多用两个字节描述其长度:2^16=65536。

2、NULL标志位指示该行数据中是否有null值,有则用1表示,占用1个字节(占用一个字节是书里写的,但是实验下来发现也并非如此,对于书里的内容还是不能全信啊)。

3、记录头信息如下图所示:

4、数据列

5、两个隐藏列:事务ID和回滚指针 

  a) 事务ID:占用6个字节,描述最新更新该行的事务的ID

  b) 回滚指针:占用7个字节,指向undo log链,用于回滚和mvcc

6、没有主键,每行回增加一个6字节的rowid列

 

现在通过一个表来具体看一下某一行在底层的存储内容,建表语句及插入数据如下所示:

create table mytest(
t1 varchar(10),
t2 varchar(10),
t3 char(10),
t4 varchar(10)
)engine=innodb charset=latin1 row_format=compact;

insert into mytest
values
('a', 'bb','bb','ccc'),
('d','ee','ee','fff'),
('d', null, null, 'fff');

通过vscode打开数据表的存储文件mytest.ibd,找到数据记录存储的位置,如下所示:

通过分析其二进制内容,找到第一行记录的位置,分析其内容如下:

03 02 01  /* 变长字段长度列表,逆序 */
00   /* null标志位,第一行没有null值 */
00 00 10 00 2C  /* 记录头,固定5字节长度 */
00 00 00 00 02 00  /* RowID,innodb自动创建,6字节 */
00 00 00 00 05 50   /* 事务id */
B7 00 00 01 2B 01 10   /* 回滚指针 */
61  /* 列1数据 'a' */
62 62  /* 列2数据 'bb' */
62 62 20 20 20 20 20 20 20 20   /* 列3数据'bb' */
63 63 63   /* 列4数据 'ccc' */

 

从上面可以看到,变长字段长度列表是逆序的,char字段未使用的位会用0x20(空格)表示。

第三条记录的二进制表示如下:

03 01  /* 变长字段长度列表,逆序 */
06   /* null标志位,第三行的第二列和第三列为null */
00 00 20 FF 98  /* 记录头,固定5字节长度 */
00 00 00 00 02 02   /* RowID,innodb自动创建,6字节 */
00 00 00 00 05 50  /* 事务id */
B7 00 00 01 2B 01 2C  /* 回滚指针 */
64   /* 列1数据 'd' */
66 66 66  /* 列4数据 'fff */

标签:00,01,varchar,字节,char,innodb,变长,20,null
来源: https://www.cnblogs.com/zhangcaiwang/p/14375890.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有