- Il existe des limites à la taille d'un INDEX. Vous avez dépassé la limite car utf8mb4 nécessite jusqu'à 4 octets par caractère , où comme utf8 n'a besoin que de 3. Pendant ce temps, la limite de taille INDEX est en octets .
La « solution » consiste à décider quoi faire à propos de l'index surdimensionné. (plus ci-dessous)
2.
ALTER TABLE t CHANGE col col ...
est le même que le plus logique
ALTER TABLE t MODIFY col ...
Le premier vous permet de changer le nom de la colonne, donc deux copies du nom de la colonne lorsque vous n'avez pas besoin de changer le nom.
-
Il est fort probable que vous ayez
VARCHAR(255)
qui prend 767 octets en utf8 (3*255+2; le « 2 » est la taille du champ de longueur). L'équivalent dans le utf8mb4 à 4 octets serait (191) (4*191+2=766 ; pas de place pour plus de 191). -
Je n'ai pas vu d'article à ce sujet. Je soupçonne que ce que je viens de dire est la plupart de ce qui doit être dit.
Alors...
Plan A :Avez-vous foo VARCHAR(255)
et c'était utf8? Les données qu'il contient sont-elles toujours (maintenant et à l'avenir) plus courtes que 191 caractères ? Si c'est le cas, faites simplement ALTER.
Plan B :Si vous avez besoin de plus de 191, avez-vous vraiment besoin de l'INDEX ? DROP INDEX peut être une alternative.
Plan C :Ou, vous pouvez utiliser un index "préfixe" :INDEX(foo(191))
, en le laissant VARCHAR(255)
. Habituellement, les index "préfixés" sont inutiles, mais vous pourriez avoir un cas d'utilisation pour lequel cela fonctionne.
Pour en discuter plus en détail, veuillez fournir SHOW CREATE TABLE
pour la table en question, et discutez de la signification de ce champ particulier et de son INDEX.