web-dev-qa-db-fra.com

Mysql :: Error: La clé spécifiée était trop longue; La longueur maximale de la clé est de 1000 octets.

script/generate acts_as_taggable_on_migration
rake db:migrate

les causes

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

Que devrais-je faire?

Voici l'encodage de ma base de données: 

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)
20
amaseuk

Ceci est uniquement un problème de MySQL -

MySQL a différents moteurs - MyISAM, InnoDB, Memory ...

MySQL a différentes limites sur la quantité d'espace que vous pouvez utiliser pour définir les index sur les colonnes - pour MyISAM, 1 000 octets; c'est 767 pour InnoDB . Et le type de données de ces colonnes est important - pour VARCHAR, c'est 3x, donc un index sur un VARCHAR (100) prendra 300 de ces octets (car 100 caractères * 3 = 300).

Pour permettre une certaine indexation lorsque vous atteignez la valeur plafond, vous pouvez définir l'index par rapport à des parties du type de données de la colonne:

CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))

En supposant que your_column est VARCHAR (100), l'index de l'exemple ci-dessus ne portera que sur les 50 premiers caractères. La recherche de données au-delà du 50ème caractère ne pourra pas utiliser l'index.

48
OMG Ponies

Cela semble être un bogue signalé ici: http://bugs.mysql.com/bug.php?id=4541

Si vous avez essayé toutes les réponses à ce message et obtenez toujours l'erreur, vous pouvez essayer d'exécuter cette commande sur votre fenêtre de requête SQL.

set GLOBAL storage_engine='InnoDb';
3
Pabinator

si cette erreur se produit dans certains processus comme la migration, elle peut être résolue en modifiant le fichier de configuration de MySql (* .ini)

default-storage-engine=InnoDB
1
user3410311

Je pense qu'un de vos champs est un varchar avec plus de 1000 caractères. par exemple. le contexte? 

Pensez à la signification d'un index. C'est un accès rapide à une ligne lorsque tous vos champs indexés sont dans la clause where. Si un index est trop long (dans le cas de mysql plus de 1000 octets), cela n'a aucun sens d'utiliser un index, car il est probablement plus lent que d'accéder à la table complète avec une analyse complète.

Je suggérerais de raccourcir l'index, par exemple en taggable_id et taggable_type, si ceux-ci sont les plus courts une fois.

Cheers - Gerhard

0
BitKFu