Mysql
 sql >> Database >  >> RDS >> Mysql

Migrazione di problemi e domande da MySQL UTF8 a UTF8MB4

  1. Ci sono limiti alla dimensione di un INDEX. Hai raggiunto il limite perché utf8mb4 ha bisogno di un massimo di 4 byte per carattere , dove come utf8 ne richiede solo 3. Nel frattempo il limite di dimensione dell'INDEX è in byte .

La "soluzione" è decidere cosa fare per l'indice sovradimensionato. (più sotto)

2.

ALTER TABLE t CHANGE col col ...

è lo stesso del più logico

ALTER TABLE t MODIFY col ...

Il primo ti permette di cambiare il nome della colonna, quindi due copie del nome della colonna quando non è necessario cambiare il nome.

  1. Molto probabilmente avevi VARCHAR(255) che richiede 767 byte in utf8 (3*255+2; il "2" è la dimensione del campo della lunghezza). L'equivalente in utf8mb4 a 4 byte sarebbe (191) (4*191+2=766; non spazio per più di 191).

  2. Non ho visto un articolo a riguardo. Sospetto che ciò che ho appena detto sia la maggior parte di ciò che deve essere detto.

Allora...

Piano A :Hai foo VARCHAR(255) ed era utf8? I dati in esso contenuti sono sempre (ora e in futuro) inferiori a 191 caratteri? In tal caso, esegui semplicemente ALTER.

Piano B :Se hai bisogno di più di 191, hai davvero bisogno dell'INDEX? DROP INDEX potrebbe essere un'alternativa.

Piano C :Oppure puoi usare un indice "prefisso":INDEX(foo(191)) , lasciandolo VARCHAR(255) . Di solito gli indici "prefissi" sono inutili, ma potresti avere un caso d'uso per il quale funziona.

Per discuterne ulteriormente, fornisci SHOW CREATE TABLE per la tabella in questione e discutere il significato di quel particolare campo e il suo INDICE.