2011-05-05 14 views
4

当运行用于创建索引的Rails的迁移,我得到:如何增加MySQL 5.1中的密钥长度?

Mysql::Error: Specified key was too long; max key length is 1000 bytes: CREATE UNIQUE INDEX `index_matches_on_foo_and_bar_id_and_baz_id` ON `matches` (`foo`, `bar_id`, `baz_id`) 

什么的MySQL变量,我需要将增加这一点,我在哪里设置它,所以它影响所有会话,而不仅仅是当前客户端会话?

+0

你能缩小foo的大小吗?考虑到下面的两个答案,它会有所帮助。 – 2011-05-05 13:45:40

+0

不,不幸的不是。我正在开发环境中为生产Rails应用程序构建一个空白模式的数据库,因此不允许更改(当然,导致问题的迁移除外)。 – 2011-05-05 15:41:55

+0

这个问题的答案已经给出[这里](http://stackoverflow.com/questions/3489041/mysqlerror-specified-key-was-too-long-max-key-length-is-1000-bytes/3489331 #3489331)和[there](http://stackoverflow.com/questions/1814532/1071-specified-key-was-too-long-max-key-length-is-767-bytes/1814594#1814594)。 – 2011-11-10 10:24:13

回答

8

InnoDB的实际上只允许在768个字节该指数。另外请注意,UTF-8编码的字符串每个字符占用3个字节,所以在这种情况下,您只能在索引中使用768/3个字符。

可能的解决方案是限制索引中字段使用的长度。但是,由于您还需要唯一的索引,因此您可能不会接受这种解决方案。使用以下内容限制所用字段的长度。

CREATE UNIQUE INDEX `index_matches_on_foo_and_bar_id_and_baz_id` ON `matches` (`foo`(100), `bar_id`(100), `baz_id`(100)) 
7

MySQL manual

“的最大密钥长度为1000个字节 这也可以通过改变 源和重新编译改变。”

+0

Hrm,这很烦人。谢谢你的信息。 – 2011-05-05 13:52:59

+0

这很糟糕,为什么它不是一个变量? – cerberos 2011-10-26 14:14:31