将电子邮件 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=DYNAMIC
或 ROW_FORMAT=COMPRESSED
这将允许您在 InnoDB 索引中包含最多 3072 字节长的列,因此您的 320 个字符的列可以包含在唯一索引中。
阅读我的博客post了解更多详情:
http://mechanics.flite.com/blog/2014/07/29/using-innodb-large-prefix-to-avoid-error-1071/
我已经检查过这个错误的原因是什么。因此,我知道我通过尝试将电子邮件 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=DYNAMIC
或ROW_FORMAT=COMPRESSED
这将允许您在 InnoDB 索引中包含最多 3072 字节长的列,因此您的 320 个字符的列可以包含在唯一索引中。
阅读我的博客post了解更多详情:
http://mechanics.flite.com/blog/2014/07/29/using-innodb-large-prefix-to-avoid-error-1071/