Anda menderita "pengkodean ganda".
Inilah yang terjadi.
- Klien memiliki karakter yang dikodekan sebagai utf8; dan
SET NAMES latin1berbohong dengan mengklaim bahwa klien memiliki penyandian latin1; dan- Kolom dalam tabel menyatakan
CHARACTER SET utf8.
Mari kita lihat apa yang terjadi pada e-acute:é .
- Hex untuk itu, di utf8 adalah 2 byte:
C3A9. SET NAMES latin1melihatnya sebagai 2 karakter yang disandikan latin1Ãdan©(hex:C3danA9)- Karena targetnya adalah
CHARACTER SET utf8, 2 karakter tersebut perlu dikonversi.Ãtelah dikonversi ke utf8 (hexC383) dan©(hexC2A9) - Jadi, 4 byte disimpan (hex
C383C2A9)
Saat membacanya kembali, langkah sebaliknya dilakukan, dan pengguna akhir mungkin tidak melihat ada yang salah. Apa yang salah:
- Data yang disimpan 2 kali lebih besar dari yang seharusnya (3x untuk bahasa Asia).
- Perbandingan untuk sama, lebih besar dari, dll mungkin tidak berfungsi seperti yang diharapkan.
ORDER BYmungkin tidak berfungsi seperti yang diharapkan.
Sesuatu seperti ini akan memperbaiki data Anda:
UPDATE ... SET col = CONVERT(BINARY(CONVERT(
CONVERT(UNHEX(col) USING utf8)
USING latin1)) USING utf8);
Diskusi lebih lanjut danContoh lainnya untuk memperbaikinya