Mysql :: Errore: la chiave specificata era troppo lunga; la lunghezza massima della chiave è 1000 byte

script/generate acts_as_taggable_on_migration rake db:migrate 

cause

 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 dovrei fare?

Ecco la mia codifica del 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) 

Questo è solo un problema di MySQL –

MySQL ha diversi motori: MyISAM, InnoDB, Memory …

MySQL ha diversi limiti sulla quantità di spazio che è ansible utilizzare per definire gli indici sulle colonne: per MyISAM si tratta di 1.000 byte; è 767 per 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 adattarsi all’indicizzazione quando si raggiunge il valore massimo, è ansible definire l’indice in relazione alle porzioni del tipo di dati della colonna:

 CREATE INDEX example_idx ON YOUR_TABLE(your_column(50)) 

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

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

Se hai provato tutte le risposte su questo post e ricevi ancora l’errore, potresti provare a eseguire questo comando nella finestra di query SQL.

 set GLOBAL storage_engine='InnoDb'; 

se questo errore si verifica in alcuni processi come la migrazione, potrebbe essere risolto modificando il file di configurazione di MySql (* .ini)

 default-storage-engine=InnoDB 

Penso che uno dei tuoi campi sia un varchar con più di 1000 caratteri. es. 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.

Saluti – Gerhard

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, le e-mail valide non possono contenere più di 256 caratteri. Forse i tuoi dati hanno un limite superiore.