2011-05-05 29 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