1 为什么使用varchar(255)
mysql8 之前,InnoDB引擎最多只支持767字节的长度的索引。如果table使用utf8编码,一个字符需要3个字节存储,那么767字节最多可以表示255个字符。
而mysql中,varchar数据实际存储格式如下: 长度前缀+实际字符串数据
+-------------------+---------------------+
| 长度前缀(1-2字节) | 实际字符串数据(变长) |
+-------------------+---------------------+
如果数据长度<=255的长度,则长度前缀刚好只需要一个字节就可以表示。此时存储一个该字段的内容消耗的内存是1字节+实际存储的数据。
因此只要是数据长度<=255长度的字段,你用varchar(255) 和用varchar(64)存储,在数据不超出64的情况下,实际的存储消耗都是一样的。
除非,你使用了utf8mb4的编码,此时一个字符需要4个字节存储。那么255个字符就需要1020个字节,超出了索引最大字节767的限制。所以如果是utf8mb4编码,且作为索引字段,则长度只能设置为191。
2 mysql8还用varchar(255)吗?
mysql8,InnoDB引擎最多支持3072个字节长度的索引。当我们的表使用utf8mb4编码时,255个字符需要1020个字节,不会超出索引长。
但是,组合索引的最大长度限制也是3072字节。所以如果你是4个字符串字段的组合索引,此时,你每个都用varchar(255),就会超出索引限制。
所以,varchar的长度还是推荐根据实际长度需要来设置。