Mysql:: erreur: la clé spécifiée était trop longue; la longueur de la clé max est de 1000 octets

script/generate acts_as_taggable_on_migration
rake db:migrate

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 dois-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)
19
demandé sur OMG Ponies 2010-08-16 00:15:17

5 réponses

C'est uniquement un MySQL -

MySQL a différents moteurs-MyISAM, InnoDB, mémoire...

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

pour accommoder une certaine indexation lorsque vous appuyez sur la valeur de plafond, vous pouvez définir l'index en ce qui concerne les parties du type de données de colonne:

CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))

en Supposant que your_column is VARCHAR (100), l'index dans l'exemple ci-dessus ne sera que sur les 50 premiers caractères. La recherche de données au-delà du 50e caractère ne pourra pas utiliser l'index.

46
répondu OMG Ponies 2010-08-15 21:24:06

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

Si vous avez essayé toutes les réponses sur ce post et le problème persiste, vous pouvez essayer d'exécuter cette commande sur votre fenêtre de requête SQL.

set GLOBAL storage_engine='InnoDb';
1
répondu Pabinator 2015-07-17 18:25:16

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

default-storage-engine=InnoDB
1
répondu user3410311 2015-10-12 10:12:40

je pense que l'un de vos champs est un varchar avec plus de 1000 caractères. par exemple, dans le contexte?

pensez à la signification d'un index. C'est un accès rapide à une rangée quand tous vos champs indexés sont dans la clause où. Si un index est trop long (dans le cas de mysql plus de 1000 octets), cela n'a aucun sens d'utiliser un index, parce que c'est probablement plus lent que d'accéder à la table complète avec un balayage complet de la table.

je suggère de raccourcir l'index, E. g à taggable_id et taggable_type, si les deux sont plus courts Une fois.

Cheers - Gerhard!--1-->

0
répondu BitKFu 2010-08-15 20:29:25

j'ai eu ce problème, donc ma solution était la suivante:

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

selon wikipedia Les e-mails valides ne peuvent pas dépasser 256 caractères. Peut-être que vos données ont une limite supérieure.

-2
répondu robert king 2011-11-01 21:57:19