当我执行以下命令时:
ALTER TABLE `mytable` ADD UNIQUE ( `column1` , `column2` );
我收到此错误消息:
#1071 - Specified key was too long; max key length is 767 bytes
关于 column1 和 column2 的信息:
column1 varchar(20) utf8_general_ci column2 varchar(500) utf8_general_ci
我认为varchar(20)只需要 21 个字节,而varchar(500)只需要 501 个字节。所以总字节数为 522,小于 767。那为什么我会收到错误消息?
varchar(20)
varchar(500)
*MySQL 5.6 版(和之前的版本)中的 *767 字节是 InnoDB 表的 规定前缀限制。MyISAM 表的长度为 1,000 字节。 在 MySQL 5.7 版 (及更高版本)中,此限制已增加到3072 字节。
您还必须注意,如果您在编码的大字符或varchar字段上设置索引,则utf8mb4必须将 767 字节(或 3072 字节)的最大索引前缀长度除以 4,得到 191 。这是因为一个utf8mb4字符的最大长度是四个字节。对于一个utf8字符,它将是三个字节,导致最大索引前缀长度为 255 (或减去空终止符,254 个字符)。
varchar
utf8mb4
utf8
您可以选择的一种选择是对您的VARCHAR字段设置下限。
VARCHAR
另一种选择(根据对这个问题的回应)是获取列的子集而不是整个数量,即:
ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );
根据需要进行调整以获取应用密钥,但我想知道是否值得审查有关此实体的数据模型以查看是否有可能进行改进,这将允许您在不影响 MySQL 限制的情况下实施预期的业务规则.