Seperti apa masalahnya
Sebelum
INSERT INTO wp_posts (post_title) VALUES ('Menu café – crème brûlée');Sesudah
INSERT INTO wp_posts (post_title) VALUES ('Menu café – crème brûlée');Dari mana asalnya
WordPress menyimpan teks sebagai UTF-8. Namun banyak instalasi lama membuat tabelnya sebagai latin1 atau terhubung dengan latin1. Selama penulisan dan pembacaan melakukan kesalahan yang sama, tidak ada yang sadar. Setelah pindah ke server baru, ekspor dengan phpMyAdmin, atau perubahan charset koneksi, setiap huruf beraksen mendadak menjadi dua karakter.
DB_CHARSETdiwp-config.phpbernilailatin1atau tidak cocok dengan tabel.- Dump diekspor sebagai
latin1dan diimpor sebagaiutf8mb4– atau sebaliknya. - Plugin atau skrip impor mengonversi teks yang sudah rusak sekali lagi. Itu menghasilkan teks terkodekan ganda seperti
é.
Perbaiki ekspornya
- Buat cadangan database sebelum mengubah apa pun.
- Ekspor tabel yang terdampak sebagai file
.sql, misalnya dengan phpMyAdmin ataumysqldump --default-character-set=utf8mb4. - Seret file ke kotak di atas. Mojibuster hanya memperbaiki bagian yang rusak dan menampilkan setiap perubahan.
- Unduh file hasil perbaikan dan impor dengan
utf8mb4ke database uji yang baru. - Periksa situsnya. Kalau semuanya tampak benar, impor ke database produksi.
Dump tidak pernah diunggah – ini penting, karena biasanya berisi akun pengguna, alamat email, dan komentar. Detail pemrosesan ada di kebijakan privasi.
Hati-hati dengan data serial
WordPress menyimpan sebagian pengaturan di wp_options dan wp_postmeta sebagai nilai PHP yang diserialkan, seperti s:5:"Café";. Angkanya adalah panjang dalam byte. Ketika é kembali menjadi é, angka itu tidak cocok lagi dan WordPress membuang nilainya. Karena itu perbaiki dulu tabel konten seperti wp_posts, wp_comments, dan wp_terms. Untuk pengaturan, wp search-replace dari WP-CLI adalah alat yang lebih tepat karena memperbarui panjangnya.
Atasi penyebabnya di MySQL
- Ubah tabel dan koneksi ke
utf8mb4, lalu aturdefine('DB_CHARSET', 'utf8mb4');diwp-config.php. - Jika kolom
latin1berisi byte UTF-8, jangan dikonversi langsung – itu akan mengodekannya untuk kedua kalinya. Jalur yang umum lewat tipe biner: pertamaMODIFY … LONGBLOB, laluMODIFY … LONGTEXT CHARACTER SET utf8mb4. - Uji setiap perubahan pada salinan database terlebih dahulu.
Pertanyaan yang sering diajukan
Bisakah saya memperbaiki seluruh database WordPress sekaligus?
Bisa, bahkan dump SQL yang besar. Perhatikan data serial di wp_options dan wp_postmeta, karena WP-CLI menanganinya lebih baik.
Apakah karakter yang sudah benar di dalam dump ikut berubah?
Tidak. Mojibuster hanya memperbaiki urutan yang jelas rusak. Teks yang benar dibiarkan apa adanya.
Apa bedanya utf8 dan utf8mb4?
Di MySQL, utf8 hanya menyimpan karakter hingga tiga byte sehingga emoji hilang. utf8mb4 adalah UTF-8 sungguhan dan pilihan yang tepat untuk WordPress.
Apakah ini berlaku untuk sistem selain WordPress?
Ya. Joomla, Drupal, Magento, atau aplikasi buatan sendiri di atas MySQL atau MariaDB punya masalah dan solusi yang sama.