VARCHAR 列的索引大小

Index size on VARCHAR column

在尝试为 VARCHAR(256) 字段编制索引时出现以下错误:

MySQL said: Index column size too large. The maximum column size is 767 bytes.

它可以使用 VARCHAR(255) 但我很好奇为什么 varchar 转换为字段中每个 'char' 看起来像 3 个保留字节,如果它使用可变宽度编码,它是否只是假设'worst case' 代表字母,所以三个字节 if utf-8?

此外,如果我只使用英语,那么获取大于 255 大小的最佳方法是在列上使用 ascii 编码吗?

每个 CHARACTER SET 都有一个最大长度,以字节为单位。 latin1ascii为1,即每个字符占一个字节。

对于 utf8 它可能需要 3 个字节,因此因子为 3。3*255+2 = 767。“2”代表长度。

utf8mb4涵盖所有当前定义的 Unicode 字符,每个字符最多占用 4 个字节。

我说“最多”是因为英语每个字符只占用 1 个字节;欧洲语言占用 1 或 2 个字节。中文和Emojis占3或4个。

索引的实现需要为列预留space尽可能多的bytes。并且有(曾经)767 的限制。较新的版本将限制提高到 3072。

同时,不要随意使用VARCHAR(256)甚至VARCHAR(255),选择一些合理的限制。