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.