在看这篇文章之前,需要先了解 Mysql 的记录存储方式,可以看这篇文章:Mysql 记录存储方式
然后,我们需要先知道一个知识点:MYSQL 中规定,除了
Text
、Blob
类型,其他类型其他所有的列(不包括隐藏列和记录头信息)占用的字节长度加起来不能超过 65535 个字节,这里注意一下,65535 是一行的最大字节数,而不是一个列的最大字节数。
需要说明的是,varchar 最大的长度其实是达不到 65535
的,因为这一行中除了 varchar
的真实数据,还包含了变长字段长度列表、NULL 值列表所占用的字节数
在我们创建一个 varchar
类型的时候,实际上创建了三个部分:
- 真实数据
- 真实数据占用的字节数
- NULL 标识(如果不允许为 NULL,则不需要)
比如我们在创建下面的表的时候:
1 | CREATE TABLE test( |
就比如我们创建上面这个表的时候,由于允许为 NULL,所以需要(因为不满 8 位,所以需要一个字节来标识)一个字节来标识
紧接着,变长字段长度列表,需要占用 2 个字节来标识,因为它的规则是:
1.如果变长字段允许存储的最大字节数小于等于 255 字节,就会用 1 字节表示「变长字段长度」; 2.如果变长字段允许存储的最大字节数大于 255 字节,就会用 2 字节表示「变长字段长度」;
我们这个例子里面的 varchar(65532),所以需要用 2 个字节来标识,所以这一行总共占用的字节数为:1+2+65532=65535,正好达到 65535 的限制。
因此我们可以得知,varchar 在可以为 NULL 的情况下,最大长度为 65532。
在不允许为 NULL 的情况下,由于不需要 NULL 标识字节,所以只需要 2 个字节来表示变长字段长度列表。因此实际可存储的最大数据字节数为 65535 - 2 = 65533 字节,即 VARCHAR(65533)
达到上限。
如果有多个字段的话,要保证所有字段的长度 + 变长字段字节数列表所占用的字节数 + NULL 值列表所占用的字节数 <= 65535。