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

Mysql 指定的密钥太长;最大密钥长度为767字节,mysql,indexing,innodb,Mysql,Indexing,Innodb,我知道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,

我知道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);
但收到了错误消息:

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

但令牌列的长度只有128字节,电子邮件是254字节,不超过767字节。希望有人能帮助我!提前谢谢

varchar(254)当您使用
utf8mb4
时,表示254个字符,每个字符有4个字节,电子邮件字段至少需要
1016个字节(254*4)
。 你可以看看这篇文章:
因此,您可以创建电子邮件列:varchar(100)

254个字符可能重复。如果您使用的是
字符集utf8mb4
,则需要乘以4才能得到字节。191是
utf8mb4
的限制,这大概是他正在使用的。注意,由于MySQL 5.7.7,有一个(默认为true)允许最多3072字节的键(对于
utf8mb4
,这是768个字符)。换言之,较新的MySQL版本没有这种限制。