指定的密钥太长;最大密钥长度为 767 字节

Specified key was too long; max key length is 767 bytes

我了解 InnoDB 索引最大长度为 767 字节。

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(254) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  .....
  `token` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `rank` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `user_token_index` (`token`),
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

我想为我的电子邮件创建索引。

alter table agent add UNIQUE index idx_on_email (email);

但是收到错误信息:

Specified key was too long; max key length is 767 bytes.

但是token列的长度只有128字节,email是254字节,不超过767字节。希望有人能帮助我!提前致谢!

varchar(254)当你使用utf8mb4时,表示254个字符,每个字符有4个字节,email字段至少需要1016 bytes (254 * 4)。 你可以看看这篇文章: http://wildlyinaccurate.com/mysql-specified-key-was-too-long-max-key-length-is-767-bytes/ 所以你可以让你的电子邮件列:varchar(100)

另一种选择是重新评估存储在 table 中的数据的性质和限制,以及它们与 JOIN 中其他数据的关系,然后证明或不证明字符集和排序规则需要 utf8mb4。

示例:如果存储的数据 and/or 与其他数据相比永远不会有超过 2 个字节的特殊字符,您可以将字符集和排序规则替换为 utf8 和 utf8_general_ci分别(或交替)。对于 ascii 格式,您可能会更短。

无论如何,这项评估/证明工作是一个很好的做法,并且可以免费带来应计绩效。