Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Probleme und Fragen beim Migrieren von MySQL UTF8 auf UTF8MB4

  1. Die Größe eines INDEX ist begrenzt. Sie sind an die Grenze gestoßen, weil utf8mb4 bis zu 4 Bytes benötigt pro Zeichen , wobei utf8 nur 3 benötigt. In der Zwischenzeit ist die INDEX-Größenbeschränkung in Bytes .

Die „Lösung“ besteht darin, zu entscheiden, was mit dem übergroßen Index zu tun ist. (mehr unten)

2.

ALTER TABLE t CHANGE col col ...

ist dasselbe wie das logischere

ALTER TABLE t MODIFY col ...

Ersteres ermöglicht es Ihnen, den Namen der Spalte zu ändern, also zwei Kopien des Spaltennamens, wenn Sie den Namen nicht ändern müssen.

  1. Sehr wahrscheinlich hatten Sie VARCHAR(255) was 767 Bytes in utf8 benötigt (3*255+2; die "2" ist die Größe des Längenfelds). Das Äquivalent im 4-Byte-utf8mb4 wäre (191) (4*191+2=766; kein Platz für mehr als 191).

  2. Ich habe keinen Artikel darüber gesehen. Ich vermute, dass das, was ich gerade gesagt habe, das meiste ist, was gesagt werden muss.

Also...

Planen Sie A :Haben Sie foo VARCHAR(255) und es war utf8? Sind die darin enthaltenen Daten immer (jetzt und in Zukunft) kürzer als 191 Zeichen? Wenn ja, dann führen Sie einfach ALTER.

aus

Planen Sie B :Wenn Sie mehr als 191 benötigen, brauchen Sie dann wirklich den INDEX? DROP INDEX kann eine Alternative sein.

Planen Sie C :Oder Sie könnten einen "Präfix"-Index verwenden:INDEX(foo(191)) , während es VARCHAR(255) bleibt . Normalerweise sind "Präfix"-Indizes nutzlos, aber Sie könnten einen Anwendungsfall haben, für den es funktioniert.

Um dies weiter zu diskutieren, geben Sie bitte SHOW CREATE TABLE an für die fragliche Tabelle und diskutieren Sie die Bedeutung dieses speziellen Feldes und seines INDEX.