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
都有一个最大长度,以字节为单位。 latin1
和ascii
为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)
,选择一些合理的限制。
在尝试为 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
都有一个最大长度,以字节为单位。 latin1
和ascii
为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)
,选择一些合理的限制。