Singkatnya, karena ini telah dibahas ribuan kali sebelumnya:
- PHP menyimpan string, ucapkan
"漢字"
, dikodekan dalam UTF-8. Byte untuk ini adalahE6 BC A2 E5 AD 97
. - Ini mengirimkan string ini melalui koneksi database yang disetel ke
latin1
. - Database menerima byte
E6 BC A2 E5 AD 97
, berpikir itu mewakililatin1
karakter. - Database menyimpan karakter
æ¼¢å
(karakter yangE6 BC A2 E5 AD 97
dipetakan ke dalamlatin1
). - Proses yang sama dibalik membuat PHP menerima byte yang sama, yang kemudian diperlakukan sebagai UTF-8. Pulang pergi bekerja dengan baik untuk PHP, meskipun database tidak memperlakukan karakter sebagaimana mestinya.
Jadi masalahnya di sini adalah koneksi database yang salah ketika data dimasukkan ke dalam database. Anda harus mengonversi data dalam database ke karakter yang benar. Coba ini:
SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
Mungkin utf8
bukan yang Anda butuhkan di sini, bereksperimen. Jika berhasil, ubah ini menjadi UPDATE
pernyataan untuk memperbarui data secara permanen.