MySQL’de karakter setinin üç yeri var
- Sütun veya tablo: verinin saklandığı karakter seti, örneğin
utf8mb4,latin1ya dalatin5(Türkçe). - Bağlantı: istemci ile sunucunun konuştuğu karakter seti –
SET NAMES utf8mb4ile veya bağlantı ayarlarından belirlenir. - Dosya: içe aktarmanın okunduğu, dışa aktarmanın yazıldığı kodlama – phpMyAdmin’de Dosyanın karakter kümesi alanı.
Üçü birbirini tutmazsa karakterler bozulur. En sık görülen durum: UTF-8 Türkçe metin latin1 bağlantıyla latin1 sütuna yazılır. Uygulamada her şey düzgün görünür, ama phpMyAdmin ve dışa aktarım ÅŸ ile ı gösterir.
Önce
"1","Şükrü Çağlayan","Işıklar Mah. Gül Sok. 12","Diyarbakır"
Sonra
"1","Şükrü Çağlayan","Işıklar Mah. Gül Sok. 12","Diyarbakır"
Karakter setlerini kontrol edin
SHOW VARIABLES LIKE 'character_set%';sunucu ve bağlantı ayarlarını gösterir.SHOW CREATE TABLE musteriler;tablonun ve sütunların karakter setini gösterir.SELECT ad, HEX(ad) FROM musteriler LIMIT 5;gerçek baytları gösterir:utf8mb4sütundaC59Fbirş’dir,C385C5B8ise çoktan bozulmuşÅŸ’dir.
Dışa aktarımı veya yedeği onarın
- Tabloyu phpMyAdmin’de SQL veya CSV olarak dışa aktarın – ya da
mysqldump --default-character-set=utf8mb4ile alın. - Dosyayı yukarıdaki kutuya bırakın. Mojibuster yalnızca bozuk yerleri onarır; doğru karakterlere dokunmaz.
- Onarılan yerleri Ne değişti? bölümünde kontrol edin ve dosyayı indirin.
utf8mb4bir tabloya aktarın ve içe aktarma penceresinde karakter kümesi olarakutf-8seçin.- Gerçek tabloyu değiştirmeden önce mutlaka bir kopyada deneyin.
Dışa aktarım bilgisayarınızdan hiç çıkmaz – müşteri verilerinde bu önemlidir. CSV olarak aldıysanız CSV dosyalarında Türkçe karakter sorunu sayfasına da bakın.
Nedeni giderin
- Yeni tabloları
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_turkish_ciile oluşturun. Türkçe sıralamadaı,i,İveIdoğru ayrılır. - Uygulamanızın bağlantısını
utf8mb4yapın, PHP’de örneğin PDO DSN içindecharset=utf8mb4kullanın. - UTF-8 baytlar
latin1bir sütundaysa doğrudanCONVERT TOkullanmayın – metni ikinci kez kodlar ve çifte kodlanmış metin oluşur. Güvenli yol ikili tür üzerinden geçer: önceMODIFY ad VARBINARY(255), sonraMODIFY ad VARCHAR(255) CHARACTER SET utf8mb4. - MySQL karakterleri
?ile değiştiriyorsa sütun veya bağlantı onları gösteremiyordur. Öyle kaydedilmiş veri kayıptır – ayrıntı için Türkçe harfler yerine soru işareti sayfası.
Sık sorulan sorular
Uygulamamda her şey düzgün, phpMyAdmin’de neden bozuk?
Çünkü uygulama ve veritabanı aynı hatayı iki kez yapıyor: uygulama UTF-8’i latin1 bağlantıyla yazıyor ve aynı yoldan geri okuyor. phpMyAdmin doğru bağlandığı için gerçekte saklananı gösterir. Metin zaten çift kodlanmışsa çift kodlama sayfasına, WordPress sitesiyse WordPress veritabanı sayfasına bakın.
Hangi collation’ı seçmeliyim?
Türkçe içerik için utf8mb4_turkish_ci en uygunudur; genel amaçlı uygulamalarda utf8mb4_unicode_ci de iş görür. Asıl önemli olan karakter setinin utf8mb4 olmasıdır – MySQL’deki utf8 emoji saklayamaz.
MariaDB’de de çalışır mı?
Evet. MariaDB karakter setlerini MySQL gibi yönetir ve komutlar aynıdır.
Yedek dosyası en fazla ne kadar büyük olabilir?
Dosya başına 100 MB’a kadar. Daha büyük veritabanlarını tablo tablo dışa aktarın.