Domanda

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

Che cosa devo fare?

Ecco la mia 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)
È stato utile?

Soluzione

Questa è solo una questione di MySQL -

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

MySQL ha diversi limiti sulla quantità di spazio è possibile utilizzare per definire indici su colonna (s) - per MyISAM è 1.000 byte; è 767 per InnoDB . E il tipo di dati di queste colonne questioni - per VARCHAR, è 3x così un indice su un VARCHAR (100) avrà 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 di colonna:

CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))

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

Altri suggerimenti

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 ad eseguire questo comando sulla vostra finestra di query SQL.

set GLOBAL storage_engine='InnoDb';

Se l'errore si verifica in alcune proccess quali la migrazione, potrebbe essere risolto modificando file di configurazione di MySql (* .ini)

default-storage-engine=InnoDB

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

pensare al significato di un indice. E 'un rapido accesso a una fila quando tutti i tuoi campi indicizzati sono all'interno della clausola WHERE. Se un indice è a lungo (in caso di MySQL più di 1000 byte), non ha senso utilizzare un indice, perché è probabilmente più lento di accesso alla tabella completa con una scansione completa della tabella.

vorrei suggerire di ridurre l'indice, per esempio per taggable_id e taggable_type, se coloro che sono entrambi più breve tempo.

Saluti - Gerhard

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top