指定的键太长;最大键长度为767字节。

6

我了解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个字节。希望有人能帮助我!提前感谢您!


1
可能是重复的问题#1071 - 指定的键太长;最大键长度为767字节 - Sadikhasan
1
254是字符数。如果您使用的是CHARACTER SET utf8mb4,那么需要乘以4才能得到字节数。 - Rick James
2个回答

12

6
191 是 utf8mb4 的限制,他很可能正在使用这个。 - Rick James
1
注意,自MySQL 5.7.7以来,有一个innodb_large_prefix选项(默认为true),允许长达3072字节的键(对于utf8mb4,这相当于768个字符)。换句话说,较新版本的MySQL不会出现此限制。 - julen

0

另一种选择是重新评估存储在该表中的数据的性质和约束,以及它们与JOIN中的其他数据的关系,然后证明是否需要utf8mb4的字符集和校对。

例如:如果存储的数据和/或与其他数据进行比较永远不会有超过2个字节的特殊字符,则可以将字符集和校对替换为utf8和utf8_general_ci(或其他替代方案)。您甚至可以使用更短的ascii字符集。

这种评估/证明工作无论如何都是一个好的实践,并且可能免费带来增加的性能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接