610 votes

#1071 - La clé spécifiée était trop longue ; la longueur maximale de la clé est de 767 octets.

Quand j'ai exécuté la commande suivante :

ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);

J'ai reçu ce message d'erreur :

#1071 - Specified key was too long; max key length is 767 bytes

Informations sur la colonne1 et la colonne2 :

column1 varchar(20) utf8_general_ci
column2  varchar(500) utf8_general_ci

Je pense varchar(20) ne nécessite que 21 octets, tandis que varchar(500) ne nécessite que 501 octets. Le total des octets est donc de 522, soit moins que 767. Alors pourquoi ai-je reçu le message d'erreur ?

#1071 - Specified key was too long; max key length is 767 bytes

548voto

OMG Ponies Points 144785

767 octets, c'est le Limitation du préfixe énoncé pour les tables InnoDB - elle est de 1 000 octets pour les tables MyISAM.

Selon le réponse à cette question vous pouvez obtenir l'application de la clé en spécifiant un sous-ensemble de la colonne plutôt que le montant total. IE :

ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );

Faites les ajustements nécessaires pour que la clé s'applique, mais je me demande si cela ne vaudrait pas la peine de revoir votre modèle de données concernant cette entité pour voir s'il n'y a pas d'améliorations qui vous permettraient de mettre en œuvre les règles commerciales prévues sans vous heurter à la limitation de MySQL.

421voto

Julien Points 736

Si quelqu'un a des problèmes avec INNODB / Utf-8 en essayant de mettre un fichier UNIQUE sur un VARCHAR(256) en le commutant sur VARCHAR(255) . Il semble que la limite soit de 255.

147voto

morganwahl Points 1

Mysql suppose le pire cas pour le nombre d'octets par caractère dans la chaîne. Pour l'encodage MySQL 'utf8', c'est 3 octets par caractère, puisque cet encodage ne permet pas de caractères au-delà de U+FFFF. Pour l'encodage MySQL 'utf8mb4', c'est 4 octets par caractère, puisque c'est ce que MySQL appelle l'UTF-8 réel.

Donc, en supposant que vous utilisez 'utf8', votre première colonne prendra 60 octets de l'index, et votre seconde 1500.

39voto

Amber Points 159296

Quel est le codage des caractères que vous utilisez ? Certains jeux de caractères (comme UTF-16, etc.) utilisent plus d'un octet par caractère.

16voto

diyism Points 1191

Vous pourriez ajouter une colonne de la md5 des colonnes longues

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X