Aggiungendo ciò che ha pubblicato David Whittaker, ho creato una query che genera la dichiarazione completa di alterazione di tabelle e colonne che convertirà ogni tabella. Potrebbe essere una buona idea correre
SET SESSION group_concat_max_len = 100000;
per prima cosa assicurati che il tuo gruppo non superi il limite molto piccolo visto qui .
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 differenza qui tra la risposta precedente è che stava usando utf8 invece di ut8mb4 e usando t1.data_type con t1.CHARACTER_MAXIMUM_LENGTH non ha funzionato per gli enum. Inoltre, la mia query esclude le viste poiché dovranno essere modificate separatamente.
Ho semplicemente usato uno script Perl per restituire tutti questi alter come array e ho iterato su di essi, riparando le colonne che erano troppo lunghe (in genere erano varchar (256) quando i dati generalmente contenevano solo 20 caratteri, quindi era una soluzione semplice ).
Ho trovato alcuni dati danneggiati durante l'alterazione da latin1 -> utf8mb4. Sembrava che i caratteri latin1 codificati in utf8 in colonne si sarebbero fatti ingannare nella conversione. Ho semplicemente tenuto i dati dalle colonne che sapevo sarebbero stati un problema in memoria da prima e dopo l'alter e li ho confrontati e generato istruzioni di aggiornamento per correggere i dati.