#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 eu ce message d'erreur :

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

Informations sur column1 et column2 :

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

Je pense que varchar(20) ne nécessite que 21 octets alors 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 obtenu le message d'erreur ?

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

767 octets est la [limitation du préfixe déclaré][1] pour les tables InnoDB dans la version 5.6 de MySQL (et les versions antérieures). Elle est de 1 000 octets pour les tables MyISAM. Dans la version 5.7 de MySQL et les versions ultérieures, cette limite a été portée à 3072 octets.

Vous devez également savoir que si vous définissez un index sur un grand champ char ou varchar qui est encodé en utf8mb4, vous devez diviser la longueur maximale du préfixe d'index de 767 octets (ou 3072 octets) par 4, ce qui donne 191. Cela s'explique par le fait que la longueur maximale d'un caractère utf8mb4 est de quatre octets. Pour un caractère utf8, elle serait de trois octets, ce qui donne une longueur maximale de préfixe d'index de 254.

L'une des possibilités qui s'offrent à vous est d'imposer une limite inférieure à vos champs VARCHAR.

Une autre option (selon la [réponse à cette question][2]) est d'obtenir le sous-ensemble de la colonne plutôt que la quantité totale, c'est-à-dire.. :

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

Faites les ajustements nécessaires pour que la clé s'applique, mais je me demande s'il 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 d'implémenter les règles de gestion prévues sans vous heurter à la limitation de MySQL.

[1] : http://dev.mysql.com/doc/refman/5.1/en/create-index.html [2] : http://bugs.mysql.com/bug.php?id=6604

Commentaires (12)

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.

Commentaires (7)

vous pourriez ajouter une colonne de la md5 des colonnes longues

Commentaires (1)