👏作者简介:大家好,我是小周同志,25届双非校招生Java选手,很高兴认识大家
📕学习出处:本文是学自小林coding (xiaolincoding.com) 网站的MYSQL图解篇
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
varchar(n) 中 n 最大取值为多少?
单字段的情况
一行数据的最大字节数是 65535(不包含 TEXT、BLOBs 这种大对象类型),其中包含了 storage overhead。
storage overhead 是什么?其实就是**「变长字段长度列表」** 和 「NULL 值列表」 ,也就是说一行数据的最大字节数 65535,其实是包含「变长字段长度列表」和 「NULL 值列表」所占用的字节数的。所以, 我们在算 varchar(n) 中 n 最大值时,需要减去 storage overhead 占用的字节数。
因为我们存储字段类型为 varchar(n) 的数据时,其实分成了三个部分来存储:
-
真实数据
-
真实数据占用的字节数
-
NULL 标识,如果不允许为NULL,这部分不需要
NULL 值列表 所占用的字节数是多少?
- 前面我创建表的时候,字段是允许为 NULL 的,所以会用 1 字节来表示「NULL 值列表」。
变长字段长度列表 所占用的字节数是多少?
「变长字段长度列表」所占用的字节数 = 所有「变长字段长度」占用的字节数之和。
所以,我们要先知道每个变长字段的「变长字段长度」需要用多少字节表示?具体情况分为:
- 条件一:如果变长字段允许存储的最大字节数小于等于 255 字节,就会用 1 字节表示「变长字段长度」;
条件二:如果变长字段允许存储的最大字节数大于 255 字节,就会用 2 字节表示「变长字段长度」
在 UTF-8 字符集下,一个字符最多需要三个字节,varchar(n) 的 n 最大取值就是 65532/3 = 21844。
多字段的情况
如果有多个字段的话,要保证所有字段的长度 + 变长字段字节数列表所占用的字节数 + NULL值列表所占用的字节数 <= 65535。
行溢出后,MySQL 是怎么处理的?
MySQL 中磁盘和内存交互的基本单位是页,一个页的大小一般是 16KB
,也就是 16384字节
,而一个 varchar(n) 类型的列最多可以存储 65532字节
,一些大对象如 TEXT、BLOB 可能存储更多的数据,这时一个页可能就存不了一条记录。这个时候就会发生行溢出,多的数据就会存到另外的「溢出页」中。