Desarrollo y bases de datos

Convertir base de datos utf8 a utf8mb4

Revisado el · mysql · codificacion

Una aplicación antigua puede requerir convertir sus tablas de utf8 a utf8mb4. No hagas reemplazos globales sobre un volcado ni elimines las tablas de producción: una sustitución de texto puede modificar datos de usuario, nombres de collations no equivalentes o contenido serializado.

1. Crear y verificar una copia inmutable

Detén temporalmente las escrituras de la aplicación y genera un volcado consistente. -p solicita la contraseña de forma interactiva y evita dejarla en el historial o en la lista de procesos:

umask 077
mysqldump --single-transaction --routines --triggers -u USUARIO_MYSQL -p BASE_DE_DATOS > base-antes-utf8mb4.sql
sha256sum base-antes-utf8mb4.sql > base-antes-utf8mb4.sql.sha256
chmod 400 base-antes-utf8mb4.sql base-antes-utf8mb4.sql.sha256
sha256sum -c base-antes-utf8mb4.sql.sha256

Descarga también ambos ficheros a un almacenamiento distinto del hosting. No edites este volcado: será el punto de recuperación.

2. Restaurar en una base nueva

Crea una base vacía, con otro usuario y nombre, y restaura allí la copia:

mysql -u USUARIO_NUEVO -p BASE_NUEVA < base-antes-utf8mb4.sql

Configura un clon de la aplicación para usar BASE_NUEVA y confirma que abre, inicia sesión y ejecuta sus operaciones principales antes de convertir nada.

3. Previsualizar y convertir el clon

Consulta primero las tablas afectadas:

SELECT TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'BASE_NUEVA'
  AND TABLE_COLLATION LIKE 'utf8\_%';

Genera las sentencias exactas que necesitarías, revísalas una a una y ejecútalas únicamente sobre BASE_NUEVA:

SELECT CONCAT(
    'ALTER TABLE `', TABLE_NAME,
    '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'
) AS sentencia_a_revisar
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'BASE_NUEVA'
  AND TABLE_TYPE = 'BASE TABLE'
  AND TABLE_COLLATION LIKE 'utf8\_%';

La collation concreta debe ser compatible con la versión de MySQL y con la aplicación. Revisa previamente índices de columnas de texto, porque al aumentar el tamaño máximo por carácter algunos índices antiguos pueden exceder el límite admitido.

4. Validar y cambiar la aplicación

Compara entre la base original y el clon:

  • esquema, índices, vistas, triggers y rutinas;
  • recuento de filas de cada tabla;
  • muestras con acentos, caracteres de cuatro bytes y contenido serializado;
  • acceso, búsquedas, edición y tareas programadas de la aplicación.

Cuando todas las comprobaciones sean correctas, vuelve a detener las escrituras, repite en el clon los cambios producidos desde el primer volcado si fuese necesario y cambia las credenciales de la aplicación para apuntar a la base nueva. Mantén la base original intacta y sin escrituras durante el periodo de observación.

Reversión

Si la validación posterior falla, detén las escrituras, restaura las credenciales anteriores y vuelve a abrir la aplicación contra la base original. No elimines la base original ni el volcado verificado hasta cerrar expresamente el periodo de recuperación.

Si tienes dudas sobre la collation adecuada o sobre cómo sincronizar las escrituras finales, contacta con soporte antes del cambio.

También te puede ayudar

  1. MySQL 8, cambio de codificación de caracteres de latin1 a utf8mb4
  2. Asistente de bases de datos MySQL
  3. Bases de datos MySQL
  4. Cerrar consultas MySQL en ejecución