Zusätzlich zu dem, was David Whittaker gepostet hat, habe ich eine Abfrage erstellt, die die vollständige Anweisung zum Ändern von Tabellen und Spalten generiert, mit der jede Tabelle konvertiert wird. Es kann eine gute Idee sein, zu rennen
SET SESSION group_concat_max_len = 100000;
zuerst sicherstellen , dass Ihre Gruppe concat geht nicht über die sehr kleine Grenze gesehen hier .
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;
Ein Unterschied zwischen der vorherigen Antwort besteht darin, dass utf8 anstelle von ut8mb4 verwendet wurde und t1.data_type mit t1.CHARACTER_MAXIMUM_LENGTH für Aufzählungen nicht funktioniert hat. Außerdem schließt meine Abfrage Ansichten aus, da diese separat geändert werden müssen.
Ich habe einfach ein Perl-Skript verwendet, um alle diese Änderungen als Array zurückzugeben, und sie durchlaufen, die zu langen Spalten korrigiert (im Allgemeinen waren sie varchar (256), wenn die Daten im Allgemeinen nur 20 Zeichen enthielten, so dass dies eine einfache Lösung war ).
Ich habe festgestellt, dass einige Daten beim Ändern von latin1 -> utf8mb4 beschädigt wurden. Es schien, als ob utf8-codierte lateinische Zeichen in Spalten bei der Konvertierung vermasselt würden. Ich habe einfach Daten aus den Spalten gespeichert, von denen ich wusste, dass sie vor und nach der Änderung ein Speicherproblem darstellen würden, und sie verglichen und Aktualisierungsanweisungen generiert, um die Daten zu korrigieren.