latin1 / utf8mb3 tablolarını utf8mb4'e dönüştür
MySQLBakımKomut
-- utf8mb4 olmayan kolonlar
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME, COLUMN_TYPE
FROM information_schema.COLUMNS
WHERE CHARACTER_SET_NAME IS NOT NULL AND CHARACTER_SET_NAME <> 'utf8mb4'
AND TABLE_SCHEMA NOT IN ('mysql', 'sys', 'information_schema', 'performance_schema')
ORDER BY TABLE_SCHEMA, TABLE_NAME;
-- Varsayilan charset'i utf8mb4 olmayan tablolar icin donusum DDL'i uret
SELECT CONCAT('ALTER TABLE `', t.TABLE_SCHEMA, '`.`', t.TABLE_NAME,
'` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, ALGORITHM=COPY, LOCK=SHARED;') AS ddl
FROM information_schema.TABLES t
JOIN information_schema.COLLATIONS c ON c.COLLATION_NAME = t.TABLE_COLLATION
WHERE c.CHARACTER_SET_NAME <> 'utf8mb4' AND t.TABLE_TYPE = 'BASE TABLE'
AND t.TABLE_SCHEMA NOT IN ('mysql', 'sys', 'information_schema', 'performance_schema');
-- Sema varsayilani ve tek tablo
ALTER DATABASE legacy CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE legacy.cust CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, ALGORITHM=COPY, LOCK=SHARED;Ne yapar?
utf8mb4 olmayan kolon ve tabloları bulur, dönüşüm DDL'lerini üretir; CONVERT TO hem tablo varsayılanını hem tüm karakter kolonlarını dönüştürür ve emoji / 4 byte karakter desteği sağlar.
Ne zaman kullanılır?
5.x'ten taşınan şemalarda, 'Incorrect string value' (1366) hatası alındığında ve farklı collation'lı kolonlar arasındaki join'ler index kullanamadığında.
Dikkat
CONVERT TO tabloyu COPY ile yeniden yazar ve süre boyunca yazmaları bloklar (INPLACE desteklenmez); büyük tabloda aynı --alter'ı pt-online-schema-change / gh-ost ile çalıştır. utf8mb4 karakter başına 4 byte'tır: index'li VARCHAR(255) 1020 byte eder; DYNAMIC / COMPRESSED row format'ta sınır 3072 byte, COMPACT / REDUNDANT'ta 767'dir, aşılırsa 1071 hatası alınır. VARCHAR / TEXT kolonlar aynı karakter kapasitesini korumak için gerekirse bir üst tipe (TEXT → MEDIUMTEXT) yükseltilir. Collation değişimi sıralama ve karşılaştırmayı etkiler: utf8mb4_0900_ai_ci aksan ve büyük/küçük harf duyarsızdır, unique index'te önceden farklı sayılan değerler çakışabilir (1062). JOIN'lenen tabloları birlikte dönüştür. İstemci bağlantısı da utf8mb4 olmalı.