- 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.
-
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). -
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.