Додаючи до опублікованого Девідом Уіттакером, я створив запит, який генерує повну таблицю та стовпці, що змінюють оператор, який перетворить кожну таблицю. Можливо, добре запуститись
НАЛАШТУЙТЕ СЕСІЮ group_concat_max_len = 100000;
перший , щоб переконатися , що ваша група CONCAT не виходить за дуже невеликий межа , як показано тут .
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;
Різниця між попередньою відповіддю полягає в тому, що використання utf8 замість ut8mb4 та використання t1.data_type з t1.CHARACTER_MAXIMUM_LENGTH не працювало для перерахунків. Також мій запит виключає представлення даних, оскільки їх доведеться змінювати окремо.
Я просто використав сценарій Perl, щоб повернути всі ці зміни як масив, і переглянув їх, виправляв занадто довгі стовпці (як правило, вони були varchar (256), коли в цілому дані мали лише 20 символів, так що це було легко виправити ).
Я виявив, що деякі дані були пошкоджені при зміні з латинського -> utf8mb4. Здавалося, що закодовані символи latin1 у стовпцях будуть перетворені у конверсії. Я просто тримав дані з стовпців, за якими я знав, що буде проблемою в пам’яті до і після зміни та порівняв їх та створив заяви оновлення для виправлення даних.