En plus de ce que David Whittaker a publié, j'ai créé une requête qui génère la table complète et l'instruction alter des colonnes qui convertira chaque table. Ce peut être une bonne idée de courir
SET SESSION group_concat_max_len = 100000;
d'abord pour vous assurer que votre groupe concat ne dépasse pas la très petite limite vue ici .
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;
Une différence ici entre la réponse précédente est qu'elle utilisait utf8 au lieu de ut8mb4 et l'utilisation de t1.data_type avec t1.CHARACTER_MAXIMUM_LENGTH ne fonctionnait pas pour les énumérations. De plus, ma requête exclut les vues car celles-ci devront être modifiées séparément.
J'ai simplement utilisé un script Perl pour renvoyer toutes ces modifications sous forme de tableau et les ai itérées, j'ai corrigé les colonnes trop longues (généralement elles étaient varchar (256) lorsque les données ne contenaient généralement que 20 caractères, donc c'était une solution facile. ).
J'ai trouvé que certaines données étaient corrompues lors de la modification de latin1 -> utf8mb4. Il semble que les caractères latin1 encodés en utf8 dans les colonnes soient gaffés lors de la conversion. J'ai simplement conservé les données des colonnes dont je savais qu'elles allaient être un problème en mémoire avant et après le changement et les ai comparées et j'ai généré des instructions de mise à jour pour corriger les données.