InnoDB行格式(或记录格式)
我们平时的数据以行为单位来向表中插入数据,这些记录在磁盘上的存放方式也被称为‘ 行格式 ’ 或者 ‘记录格式’。InnoDB存储引擎设计了4种不同类型的‘ 行格式 ’,分别是‘ Compact’,’Redundant‘,’Dynamic‘’和’ compressed‘行格式。
# 查看Mysql8的默认行格式
SELECT @@innodb_default_row_format;
# 也可以使用如下语法查看具体表使用的行格式;
SHOW TABLE STATUS LIKE '表名'\G
指定行格式的语法
CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称
ALTER TABLE 表名 ROW_FORMAT=行格式名称
CREATE TABLE record_test_table(
col1 VARCHAR(8),
col2 VARCHAR(8) NOT NULL,
col3 CHAR(8),
col4 VARCHAR(8)
) CHARSET = ASCII ROW_FORMAT=CPMPACT;
INSERT INTO record_test_table(col1, col2, col3, col4)VALUES('zhangsan', 'lisi', 'wangwu', 'songhk'),('tong', 'chen', NULL, NULL);
COMPACT行格式
在MySQL 5.1版本中,默认设置为Compact行格式。一条完整的记录其实可以被分为记录的额外信息和记录的真实数据两大部分。

变长字段长度列表
MySQL支持一些变长的数据类型,比如VARCHAR(M)、VARBINARY(M)、TEXT类型,BLOB类型,这些数据类型修饰列称为变长字段,变长字段中存储多少字节的数据不是固定的,所以我们在存储真实数据的时候需要顺便把这些数据占用的字节数也存起来。在Compact行格式中,把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位,从而形成一个变长字段长度列表。
注意:这里面存储的变长长度和字段顺序是反过来的。比如两个varchar字段在表结构的顺序是a(10),b(15)。那么在变长字段长度列表中存储的长度顺序就是15,10,是反过来的。
以record_test_table表中的第一条记录举例:因为record_test_table表的col1、col2、col2列都是VARCHAR(8)类型的,所以这三个列的值的长度都需要保存在记录开头处,注意record_test_table表中的各个列都使用的是ascii字符集(每个字符只需要1个字节来进行编码)。

又因为这些长度值需要按照列的逆序存放,所以最后变长字段长度列表的字节串用十六进制表示的效果就是(各个字节之间实际上没有空格,用空格隔开知识方便理解):06 04 08
把这个节点串组成的变长字段长度列表填入上边的示意图中的效果就是:





