将电子邮件 VARCHAR(320) 存储为 UNIQUE,#1071 - 指定的密钥太长;最大密钥长度为 767

Storing email VARCHAR(320) as UNIQUE, #1071 - Specified key was too long; max key length is 767

我已经检查过这个错误的原因是什么。因此,我知道我通过尝试将电子邮件 VARCHAR(320) 设置为 UNIQUE 键(320 * 3 = 960 字节)超出了限制(767 字节)。

但是,我使用 MySQL 作为数据库,我需要使用电子邮件值作为我的应用程序中的唯一键。你能告诉我,我应该改变什么来克服这个问题吗?

在前 254 个字符左右创建唯一索引:

create unique index idx_t_email on t(email(254));

电子邮件应少于 254 个字符。

根据这个 answer,无论如何,最长可能的电子邮件是 254 个字符,所以这应该没问题。

假设您使用的是 MySQL 5.5.14 或更新版本,您可以通过以下方式解决此问题:

  • 启用 innodb_large_prefix 服务器设置
  • 启用innodb_file_format = BARRACUDA
  • 使用 ROW_FORMAT=DYNAMICROW_FORMAT=COMPRESSED

这将允许您在 InnoDB 索引中包含最多 3072 字节长的列,因此您的 320 个字符的列可以包含在唯一索引中。

阅读我的博客post了解更多详情:

http://mechanics.flite.com/blog/2014/07/29/using-innodb-large-prefix-to-avoid-error-1071/