首先,我们要知道 MySQL Innodb 引擎对于索引的长度是有限制的,最大为 767 字节。
你采用不同的字符编码方式,对应的字节数是不一样的,比如我们最常用的 utf8mb4 字符集是 4 字节字符集,则 767 字节 / 4 字节每字符 = 191字符(默认索引最大长度),所以在 varchar(255) 或 char(255) 类型字段上创建索引会失败,报错会提示最大索引长度为 767 字节。
其他的一些编码方式对应关系分别是:latin1 编码的,一个字符占用一个字节,gbk 编码的,一个字符占用两个字节,utf8 编码的,一个字符占用三个字节。
总的来说,索引长度计算规则为:
所有的索引字段,如果没有设置 Not Null,则需要加一个字节(这也是我们为什么建议建表时不要有 Null 字段的原因之一)。
对于定长字段,int 类型占四个字节、date 占三个字节、char(n) 占 N 个字符。
对于变成字段 varchar(n),则是 N 个字符 + 两个字节。
不同的字符集,一个字符占用的字节数不同。latin1编码的,一个字符占用一个字节,gbk编码的,一个字符占用两个字节,utf8编码的,一个字符占用三个字节。
索引长度 char()、varchar() 索引长度的计算公式:
Character Set:utf8mb4