- Hay límites en el tamaño de un ÍNDICE. Te topaste con el límite porque utf8mb4 necesita hasta 4 bytes por carácter , mientras que utf8 solo necesita 3. Mientras tanto, el límite de tamaño de INDEX está en bytes .
La 'solución' es decidir qué hacer con el índice sobredimensionado. (más abajo)
2.
ALTER TABLE t CHANGE col col ...
es lo mismo que mas logico
ALTER TABLE t MODIFY col ...
El primero le permite cambiar el nombre de la columna, por lo tanto, dos copias del nombre de la columna cuando no necesita cambiar el nombre.
-
Muy probablemente tenías
VARCHAR(255)
que ocupa 767 bytes en utf8 (3*255+2; el "2" es el tamaño del campo de longitud). El equivalente en utf8mb4 de 4 bytes sería (191) (4*191+2=766; no hay espacio para más de 191). -
No he visto un artículo al respecto. Sospecho que lo que acabo de decir es la mayor parte de lo que hay que decir.
Entonces...
Plan A :¿Tienes foo VARCHAR(255)
y era utf8? ¿Los datos que contiene siempre (ahora y en el futuro) tienen menos de 191 caracteres? Si es así, simplemente haga ALTER.
Plan B :Si necesita más de 191, ¿realmente necesita el ÍNDICE? DROP INDEX puede ser una alternativa.
Plan C :O bien, podría usar un índice de "prefijo":INDEX(foo(191))
, dejándolo VARCHAR(255)
. Por lo general, los índices de "prefijo" son inútiles, pero podría tiene un caso de uso para el que funciona.
Para discutir esto más a fondo, proporcione SHOW CREATE TABLE
para la tabla en cuestión y discuta el significado de ese campo en particular y su ÍNDICE.