Sorun nasıl görünür
Önce
INSERT INTO wp_posts (post_title) VALUES ('Şişli kafe menüsü – çıtır börek');Sonra
INSERT INTO wp_posts (post_title) VALUES ('Şişli kafe menüsü – çıtır börek');Nereden kaynaklanır
WordPress metni UTF-8 olarak saklar. Birçok eski kurulum ise tablolarını latin1 olarak oluşturmuş veya latin1 ile bağlanmıştır. Yazma ve okuma aynı hatayı yaptığı sürece kimse fark etmez. Yeni bir sunucuya taşıdıktan, phpMyAdmin ile dışa aktardıktan veya bağlantı karakter kümesini değiştirdikten sonra her özel harf birden iki karaktere dönüşür.
wp-config.phpiçindekiDB_CHARSETdeğerilatin1ya da tablolarla uyumsuz.- Yedek
latin1olarak dışa aktarılıputf8mb4olarak içe aktarılmış, ya da tersi. - Bir eklenti veya içe aktarma betiği zaten bozuk metni bir kez daha dönüştürmüş. Bu,
ÅŸgibi çift kodlanmış metin üretir.
Yedeği onarma
- Bir şeyi değiştirmeden önce veritabanının yedeğini alın.
- İlgili tabloları
.sqldosyası olarak dışa aktarın, örneğin phpMyAdmin ile ya damysqldump --default-character-set=utf8mb4ile. - Dosyayı yukarıdaki kutuya bırakın. Mojibuster yalnızca bozuk yerleri onarır ve her değişikliği gösterir.
- Onarılan dosyayı indirin ve
utf8mb4ile boş bir test veritabanına aktarın. - Siteyi kontrol edin. Her şey doğruysa canlı veritabanına aktarın.
Yedek asla yüklenmez; bu önemlidir, çünkü içinde genellikle kullanıcı hesapları, e-posta adresleri ve yorumlar bulunur. Gizlilik ayrıntıları için gizlilik bildirimine bakın.
Serileştirilmiş verilere dikkat
WordPress bazı ayarları wp_options ve wp_postmeta içinde serileştirilmiş PHP değerleri olarak saklar, örneğin s:5:"Şule";. Sayı, bayt cinsinden uzunluktur. ÅŸ yeniden ş olunca uzunluk tutmaz ve WordPress değeri çöpe atar. Bu yüzden önce wp_posts, wp_comments ve wp_terms gibi içerik tablolarını onarın. Ayarlar için WP-CLI’nin wp search-replace komutu daha uygundur, çünkü uzunlukları günceller.
Nedeni MySQL’de düzeltme
- Tabloları ve bağlantıyı
utf8mb4’e geçirin vewp-config.phpiçindedefine('DB_CHARSET', 'utf8mb4');yazın. - Bir
latin1sütunu aslında UTF-8 baytları içeriyorsa onu doğrudan dönüştürmeyin: bu, onu ikinci kez kodlar. Olağan yol ikili bir türden geçer: önceMODIFY … LONGBLOB, sonraMODIFY … LONGTEXT CHARACTER SET utf8mb4. - Her değişikliği önce veritabanının bir kopyasında deneyin.
Sık sorulan sorular
Bütün bir WordPress veritabanını tek seferde onarabilir miyim?
Evet, büyük SQL yedekleri de olur. Yine de wp_options ve wp_postmeta içindeki serileştirilmiş verilere dikkat edin; bunları WP-CLI daha iyi halleder.
Yedekteki doğru karakterler değişir mi?
Hayır. Mojibuster yalnızca açıkça bozuk dizileri onarır. Doğru metin olduğu gibi kalır.
utf8 ile utf8mb4 arasındaki fark nedir?
MySQL’de utf8 en fazla üç baytlık karakterleri saklar; emojiler kaybolur. utf8mb4 gerçek UTF-8’dir ve WordPress için doğru seçimdir.
WordPress dışındaki sistemlerde de çalışır mı?
Evet. Joomla, Drupal, Magento veya MySQL ya da MariaDB üzerindeki kendi uygulamanızda da sorun ve çözüm aynıdır.