2010-08-15 135 views
18
script/generate acts_as_taggable_on_migration 
rake db:migrate 

導致Mysql ::錯誤:指定的鍵太長;最大密鑰長度爲1000字節

Mysql::Error: Specified key was too long; max key length is 1000 bytes: CREATE INDEX `index_taggings_on_taggable_id_and_taggable_type_and_context` ON `taggings` (`taggable_id`, `taggable_type`, `context`) 

我應該怎麼辦?

這裏是我的數據庫編碼:

mysql> SHOW VARIABLES LIKE 'character\_set\_%'; 
+--------------------------+--------+ 
| Variable_name   | Value | 
+--------------------------+--------+ 
| character_set_client  | latin1 | 
| character_set_connection | latin1 | 
| character_set_database | utf8 | 
| character_set_filesystem | binary | 
| character_set_results | latin1 | 
| character_set_server  | latin1 | 
| character_set_system  | utf8 | 
+--------------------------+--------+ 
7 rows in set (0.00 sec) 
+0

首先提供更多信息來解決。正在遷移什麼? – 2010-08-15 20:23:24

+0

http://github.com/mbleigh/acts-as-taggable-on – amaseuk 2010-08-15 20:25:30

+0

http://github.com/mbleigh/acts-as-taggable-on/blob/master/generators/acts_as_taggable_on_migration/templates/migration.rb – amaseuk 2010-08-15 20:26:29

回答

46

這僅僅是一個MySQL的問題 -

MySQL有不同的引擎 - 的MyISAM,InnoDB的,記憶...

MySQL has different limits on the amount of space you can use to define indexes on column(s) - for MyISAM it's 1,000 bytes; it's 767 for InnoDB。這些列的數據類型很重要 - 對於VARCHAR,它的值是3x,因此VARCHAR(100)上的索引將佔用300個字節(因爲100個字符* 3 = 300)。

CREATE INDEX example_idx ON YOUR_TABLE(your_column(50)) 

假設your_column是VARCHAR(100),在所述索引:

爲了適應一些索引當你點擊上限值,則可以相對於列的數據類型的部分限定的索引上面的例子只會在前50個字符。搜索超出第50個字符的數據將無法使用索引。

+2

你知道一種不會導致上述錯誤的MySQL引擎嗎? – amaseuk 2010-08-16 07:46:16

+2

通過將默認引擎從MyISAM更改爲InnoDB來解決。謝謝。 – amaseuk 2010-08-16 19:42:07

+1

但是,我們如何獲得整列的索引而不僅僅是第一個X字節? – Pacerier 2012-07-11 01:52:35

0

我覺得你的領域之一是擁有超過1000個字符爲varchar。例如背景?

想想索引的含義。當所有索引字段位於where子句內時,它可以快速訪問行。如果索引很長(在mysql數量超過1000字節的情況下),使用索引是沒有意義的,因爲它可能比使用全表掃描訪問完整表要慢。

我建議縮短索引,例如taggable_id和taggable_type,如果這兩者都較短一次。

乾杯 - 格哈德

+0

嗨, 這是一個常見的Rails插件/寶石,我還沒有看到在互聯網上引用這個錯誤信息 - 不知道它是否是需要修改的遷移文件或我的數據庫...? – amaseuk 2010-08-15 20:32:02

+0

您正在使用哪種MySql版本?目前的還是Mysql 4.x? – BitKFu 2010-08-15 20:40:45

+0

我正在使用5.1.35 – amaseuk 2010-08-16 10:20:01

-2

我有這個問題,所以我的解決辦法是這樣的:

alter table robs_temp.missing_email change email email varchar(300); 
ALTER TABLE robs_temp.missing_email add primary key (email); -- Now it works. 

根據維基百科的有效電子郵件不能超過256個字符。也許你的數據有一些上限。

0

這似乎是在這裏報告了一個錯誤:http://bugs.mysql.com/bug.php?id=4541

如果您已經嘗試對這個職位所有的答案,仍然得到錯誤,你可能會想嘗試你的SQL查詢窗口中運行這個命令。

set GLOBAL storage_engine='InnoDb'; 
+0

未知的系統變量'storage_engine'。不起作用的MySQL 5.7 – astroanu 2018-02-14 09:47:47

1

如果發生像遷移一些proccess這個錯誤,它可以通過改變的MySql的配置文件(* .INI)

default-storage-engine=InnoDB 
相關問題