Utf8mb4 karakter seti ve utf8mb4_unicode_ci sıralamasını MySQL’de kullanın ve phpMyAdmin veya ALTER komutlarıyla değiştirin, bağlantı için SET NAMES’i de unutmayın.
Charset (karakter kümesi) belirler veritabanının hangi karakterleri saklayabileceğini ve collation karakterlerin nasıl karşılaştırıldığını ve sıralandığını belirler. Yanlış charset, Danimarka harflerinin (æ, ø, å) veya emojilerin soru işareti ya da mojibake olarak görünmesinin en yaygın sebebidir (örn. æ yerine æ).
utf8mb4 charset olarak ve utf8mb4_unicode_ci collation olarak kullanın. utf8mb4 tüm Unicode karakterlerini, emoji dahil, destekler.
Tüm veritabanı için varsayılanı değiştirin (sadece yeni tablolar için geçerlidir):
utf8mb4_unicode_ci seçin.Mevcut bir tabloyu değiştirin (tüm sütunları dahil):
Veritabanının varsayılanını değiştirin:
ALTER DATABASE mindatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Bir tabloyu ve tüm sütunlarını değiştirin:
ALTER TABLE mintabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
phpMyAdmin'de charset'i sütun bazında değiştirebilirsiniz: tabloyu seçin, Struktur sekmesine tıklayın, sütunun yanındaki Skift butonuna tıklayın ve sütun tanımında yeni collation'ı seçin.
ALTER komutlarını otomatik olarak oluşturun:
SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mindatabase' AND TABLE_TYPE = 'BASE TABLE';
SQL sekmesinde phpMyAdmin üzerinden ya da komut satırından sonucu çalıştırın.
Veritabanı charset'i ile bağlantı charset'i iki farklı şeydir. Tablolarınız utf8mb4 olarak doğru ayarlanmış olsa bile, uygulama ile MySQL arasındaki bağlantı başka bir charset kullanıyorsa, karakterler geçişte bozulabilir.
SET NAMES utf8mb4 üç oturum değişkenini bir kerede ayarlar:
character_set_client — sunucunun istemciden alması beklenen karakter kümesicharacter_set_connection — sunucunun sorgu işleme sırasında dahili olarak kullandığı karakter kümesicharacter_set_results — sunucunun istemciye geri gönderdiği karakter kümesiSET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Daha iyi bir uygulama: SET NAMESi manuel göndermek yerine sürücünün yerleşik charset seçeneğini kullanın. Bu, mysqli_real_escape_string() ve PDO::quote() gibi fonksiyonların da doğru charset'i kullanmasını sağlar — aksi takdirde nadir durumlarda SQL enjeksiyonuna açık hale gelebilirsiniz.
Destek kategorisinden makale: MySQL