sql >> Base de Datos >  >> RDS >> Mysql

Problemas y preguntas sobre la migración de MySQL UTF8 a UTF8MB4

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

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

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