2016-01-11 152 views
1

我了解InnoDB索引最大长度是767字节。指定的密钥太长;最大密钥长度是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字节](http://stackoverflow.com/questions/1814532/1071-specified-key-was-too-long-max-key-length-is-767-bytes) – Sadikhasan

+1

254是_characters_。如果您使用'CHARACTER SET utf8mb4',则需要乘以4才能得到_bytes_。 –

回答

4

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

+4

191是'utf8mb4'的限制,据推测他正在使用这个限制。 –

+0

自从MySQL 5.7.7以来有一个['innodb_large_prefix'选项](https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_large_prefix)(默认为true),它允许使用键最多3072个字节('utf8mb4'为768个字符)。换句话说,较新的MySQL版本不会表现出这种限制。 – julen

相关问题