Menambah apa yang diposkan David Whittaker, saya telah membuat kueri yang menghasilkan tabel lengkap dan kolom mengubah pernyataan yang akan mengonversi setiap tabel. Mungkin ide yang bagus untuk dijalankan
SET SESSION group_concat_max_len = 100000;
pertama-tama untuk memastikan bahwa concat grup Anda tidak melewati batas yang sangat kecil seperti yang terlihat di sini .
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;
Perbedaan di sini antara jawaban sebelumnya adalah menggunakan utf8 bukan ut8mb4 dan menggunakan t1.data_type dengan t1.CHARACTER_MAXIMUM_LENGTH tidak berfungsi untuk enum. Selain itu, kueri saya mengecualikan tampilan karena harus diubah secara terpisah.
Saya hanya menggunakan skrip Perl untuk mengembalikan semua perubahan ini sebagai array dan mengulanginya, memperbaiki kolom yang terlalu panjang (umumnya varchar (256) ketika data umumnya hanya memiliki 20 karakter di dalamnya sehingga mudah diperbaiki ).
Saya menemukan beberapa data rusak ketika mengubah dari latin1 -> utf8mb4. Tampaknya ut1 disandikan karakter latin1 dalam kolom akan melakukan kesalahan dalam konversi. Saya hanya memegang data dari kolom yang saya tahu akan menjadi masalah dalam memori dari sebelum dan sesudah perubahan dan membandingkannya dan menghasilkan laporan pembaruan untuk memperbaiki data.