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

provocaMysql :: Errore: la chiave specificata era troppo lunga; max lunghezza della chiave è di 1000 byte

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`) 

Cosa devo fare?

Ecco il mio codifica database:

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

fornire ulteriori informazioni prima. Cosa viene migrato? –

+0

http://github.com/mbleigh/acts-as-taggable-on – amaseuk

+0

http://github.com/mbleigh/acts-as-taggable-on/blob/master/generators/acts_as_taggable_on_migration/templates/migration.rb – amaseuk

risposta

46

Questo è solo un problema di MySQL -

MySQL ha diversi motori - MyISAM, InnoDB, memoria ...

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. E il tipo di dati di queste colonne è importante - per VARCHAR, è 3x quindi un indice su un VARCHAR (100) richiederà 300 di quei byte (perché 100 caratteri * 3 = 300).

Per accogliere alcuni indicizzazione quando si preme il valore limite, è possibile definire l'indice con riferimento a porzioni del tipo di dati colonna:

CREATE INDEX example_idx ON YOUR_TABLE(your_column(50)) 

Supponendo che your_column è VARCHAR (100), l'indice nella l'esempio sopra sarà solo sui primi 50 caratteri. La ricerca di dati oltre il 50 ° carattere non sarà in grado di utilizzare l'indice.

+2

Sai di un tipo di motore MySQL che non avrebbe causato l'errore sopra? – amaseuk

+2

Risolto cambiando il motore predefinito da MyISAM a InnoDB. Grazie. – amaseuk

+1

Ma come si ottiene l'indice dell'intera colonna anziché solo i primi X byte? – Pacerier

0

Credo che uno dei campi è un varchar con più di 1000 caratteri. per esempio. contesto?

Pensa al significato di un indice. È l'accesso rapido a una riga quando tutti i campi indicizzati sono all'interno della clausola where. Se un indice è long (in caso di mysql più di 1000 byte), non ha senso utilizzare un indice, perché è probabilmente più lento dell'accesso alla tabella completa con una scansione completa della tabella.

Suggerirei di abbreviare l'indice, ad esempio taggable_id e taggable_type, se entrambi sono più brevi una volta.

Acclamazioni - Gerhard

+0

Ciao, Questo è un comune plugin/gemma di Rails e non ho visto questo messaggio di errore citato su Internet - non sono sicuro se sia il file di migrazione, o il mio database, che ha bisogno di modificare ...? – amaseuk

+0

Quale versione di MySql stai usando? Quello corrente o Mysql 4.x? – BitKFu

+0

Sto usando 5.1.35 – amaseuk

-2

Ho avuto questo problema, quindi la mia soluzione era questa:

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

Secondo Wikipedia email valide non possono essere più di 256 caratteri. Forse i tuoi dati hanno un limite superiore.

0

questo sembra essere un bug che è stato segnalato qui: http://bugs.mysql.com/bug.php?id=4541

Se avete provato tutte le risposte a questo articolo e ancora ottenere l'errore, si consiglia di provare a eseguire questo comando sulla vostra finestra query SQL .

set GLOBAL storage_engine='InnoDb'; 
+0

Variabile di sistema sconosciuta 'storage_engine'. non funziona da mysql 5.7 – astroanu

1

se questo errore si verifica in alcune proccess come migrazione, potrebbero essere risolti modificando file di configurazione di MySql (* .ini)

default-storage-engine=InnoDB 
Problemi correlati