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
5 votes
Étant donné qu'il ne s'agit pas de 520 octets, mais plutôt de 2080 octets, ce qui dépasse de loin 767 octets, vous pouvez utiliser column1 varchar(20) et column2 varchar(170). Si vous voulez une équivalence caractère/octet, utilisez latin1.
3 votes
Je pense que votre calcul est un peu faux ici. mysql utilise 1 ou 2 octets supplémentaires pour enregistrer la longueur des valeurs : 1 octet si la longueur maximale de la colonne est de 255 octets ou moins, 2 si elle est supérieure à 255 octets. l'encodage utf8_general_ci nécessite 3 octets par caractère, donc varchar(20) utilise 61 octets, varchar(500) utilise 1502 octets au total 1563 octets
3 votes
Mysql> select maxlen, character_set_name from information_schema.character_sets where character_set_name in('latin1', 'utf8', 'utf8mb4') ; maxlen | character_set_name ------ | ------------------- 1 | latin1 ------ | ------------------- 3 | utf8 ------ | ------------------- 4 | utf8mb4
20 votes
Si vous voulez un caractère/octet équivalent, utilisez latin1'. ne faites pas ça . Latin1, ça craint vraiment, vraiment. Vous allez le regretter.
0 votes
Consultez le site stackoverflow.com/a/52778785/2137210 pour la solution