David Whittaker ne gönderdi ekleyerek, tüm tablo ve sütunları değiştirecek her tablo dönüştürecek deyimi değiştiren bir sorgu oluşturduk. Koşmak iyi bir fikir olabilir
OTURUM AYARLA group_concat_max_len = 100000;
önce grup concat'ınızın burada görüldüğü gibi çok küçük sınırı aşmadığından emin olmak için .
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;
Burada önceki cevap arasındaki fark, ut8mb4 yerine utf8 kullanmak ve t1.CHARACTER_MAXIMUM_LENGTH ile t1.data_type kullanmak sayılar için çalışmadı. Ayrıca, bunlar ayrı ayrı değiştirilmesi gerekeceğinden, sorgum görünümleri hariç tutuyor.
Ben sadece bir dizi olarak tüm bu alters döndürmek için bir Perl betiği kullandım ve onlar üzerinde yinelenen, çok uzun olan sütunlar sabit (genellikle varchar (256) veri genellikle sadece 20 karakter vardı, bu yüzden kolay bir düzeltme oldu ).
Ben latin1 -> utf8mb4 değiştirirken bazı verilerin bozuk bulundu. Sütunlarda utf8 kodlu latin1 karakterlerinin dönüşümde bozulacağı görülüyordu. Sadece değiştirmeden önce ve sonra bellekte bir sorun olacağını bildiğim sütunlardan veri tuttum ve bunları karşılaştırdı ve verileri düzeltmek için güncelleme deyimleri oluşturdu.