我为两列定义了一个唯一约束:一个 bigint 和一个 VARCHAR(256) COLLATE utf8mb4_unicode_ci
然后发生了这个错误(我已经很熟悉了):
Specified key was too long; max key length is 767 bytes
然后我尝试将 VARCHAR 列的长度设置得尽可能高而不会出错。
令我惊讶的是,MySQL 允许我将长度更改为 191,但这意味着索引的长度为 8+191*4=772 字节,但错误提示只允许使用 767 字节。
这是表格:
CREATE TABLE `file_content`
(
`file_content_id` bigint(20) NOT NULL AUTO_INCREMENT,
`local_filename` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`directory_id` bigint(20) NOT NULL,
...
PRIMARY KEY (`file_content_id`),
UNIQUE KEY `fc_dir_name` (`directory_id`,`local_filename`),
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
我正在使用 MySQL 5.5.27
修改后的数学:
2+764 < 767,所以 VARCHAR 列通过了那个测试
8+2+764 < 3KB,所以整个索引通过了另一个测试。(就像一对 191 个字符的 VARCHAR)
编辑
参考手册对索引有一些复杂的限制。通常,列不超过 767字节,整个索引不超过 3072字节是安全的。请记住,utf8mb4中的一个字符(对于这些限制)计为 4个字节。我有一份limits 的汇编。