Nous avons rencontré ce problème lors de la tentative d'ajout d'un index UNIQUE à un champ VARCHAR (255) à l'aide de utf8mb4. Bien que le problème soit déjà bien décrit ici, je voulais ajouter quelques conseils pratiques sur la façon dont nous avons compris cela et l'avons résolu.
Lors de l'utilisation de utf8mb4, les caractères comptent pour 4 octets, alors que sous utf8, ils peuvent l'être pour 3 octets. Les bases de données InnoDB ont une limite selon laquelle les index ne peuvent contenir que 767 octets. Ainsi, lorsque vous utilisez utf8, vous pouvez stocker 255 caractères (767/3 = 255), mais en utilisant utf8mb4, vous ne pouvez stocker que 191 caractères (767/4 = 191).
Vous pouvez absolument ajouter des index réguliers pour les VARCHAR(255)
champs en utilisant utf8mb4, mais ce qui se passe, c'est que la taille de l'index est tronquée automatiquement à 191 caractères - comme unique_key
ici:
C'est très bien, car les index réguliers sont juste utilisés pour aider MySQL à rechercher plus rapidement dans vos données. Le champ entier n'a pas besoin d'être indexé.
Alors, pourquoi MySQL tronque-t-il automatiquement l'index pour les index réguliers, mais renvoie-t-il une erreur explicite lorsque vous essayez de le faire pour les index uniques? Eh bien, pour que MySQL puisse déterminer si la valeur insérée ou mise à jour existe déjà, il doit réellement indexer la valeur entière et pas seulement une partie.
À la fin de la journée, si vous souhaitez avoir un index unique sur un champ, tout le contenu du champ doit tenir dans l'index. Pour utf8mb4, cela signifie réduire la longueur des champs VARCHAR à 191 caractères ou moins. Si vous n'avez pas besoin d'utf8mb4 pour cette table ou ce champ, vous pouvez le redéposer vers utf8 et conserver vos 255 champs de longueur.