Agregando a lo David Whittaker publicó, he creado una consulta que genera la tabla completa y las columnas alteran la afirmación de que w convertiré cada tabla. Puede ser una buena idea ejecutar
SET SESSION group_concat_max_len = 100000;
primero para asegurarse de que su grupo concat no sobrepase el límite muy pequeño como se ve here.
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;
A diferencia aquí entre la respuesta anterior es que fue el uso de UTF-8 en lugar de ut8mb4 y el uso de t1.data_type con t1.CHARACTER_MAXIMUM_LENGTH no funcionó para enumeraciones. Además, mi consulta excluye las vistas, ya que deberán modificarse por separado.
Simplemente utilicé una secuencia de comandos de Perl para devolver todas estas alteraciones como una matriz y las repetí, corrigió las columnas que eran demasiado largas (generalmente eran varchar (256) cuando los datos generalmente solo tenían 20 caracteres, de modo 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 serían ridículos en la conversión. Simplemente mantuve los datos de las columnas que sabía que iban a ser un problema en la memoria de antes y después del alter y los comparé y generé declaraciones de actualización para corregir los datos.
posible duplicado de [MySql alter table Collation] (http://stackoverflow.com/questions/742205/mysql-alter-table-collation) – kenorb