Además de lo que David Whittaker publicó, he creado una consulta que genera la tabla completa y la declaración de modificación de columnas que convertirá cada tabla. Puede ser una buena idea correr
SET SESSION group_concat_max_len = 100000;
primero para asegurarse de que su grupo concat no exceda el límite muy pequeño como se ve aquí .
SELECT a.table_name, concat('ALTER TABLE ', a.table_schema, '.', a.table_name, ' DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci, ',
group_concat(distinct(concat(' MODIFY ', column_name, ' ', column_type, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ', if (is_nullable = 'NO', ' NOT', ''), ' NULL ',
if (COLUMN_DEFAULT is not null, CONCAT(' DEFAULT \'', COLUMN_DEFAULT, '\''), ''), if (EXTRA != '', CONCAT(' ', EXTRA), '')))), ';') as alter_statement
FROM information_schema.columns a
INNER JOIN INFORMATION_SCHEMA.TABLES b ON a.TABLE_CATALOG = b.TABLE_CATALOG
AND a.TABLE_SCHEMA = b.TABLE_SCHEMA
AND a.TABLE_NAME = b.TABLE_NAME
AND b.table_type != 'view'
WHERE a.table_schema = ? and (collation_name = 'latin1_swedish_ci' or collation_name = 'utf8mb4_general_ci')
GROUP BY table_name;
Una diferencia aquí entre la respuesta anterior es que estaba usando utf8 en lugar de ut8mb4 y usando t1.data_type con t1.CHARACTER_MAXIMUM_LENGTH no funcionó para las enumeraciones. Además, mi consulta excluye las vistas, ya que tendrán que modificarse por separado.
Simplemente utilicé un script de Perl para devolver todos estos cambios como una matriz e iteré sobre ellos, arreglé las columnas que eran demasiado largas (generalmente eran varchar (256) cuando los datos generalmente solo tenían 20 caracteres en ellos, así que fue una solución fácil )
Encontré que algunos datos estaban dañados al alterar desde latin1 -> utf8mb4. Parecía que los caracteres latin1 codificados en utf8 en las columnas se burlarían en la conversión. Simplemente mantuve datos de las columnas que sabía que iban a ser un problema en la memoria antes y después de la modificación y los comparé y generé declaraciones de actualización para corregir los datos.