Anda menderita "pengkodean ganda".
Inilah yang terjadi.
- Klien memiliki karakter yang dikodekan sebagai utf8; dan
SET NAMES latin1
berbohong 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 latin1
melihatnya sebagai 2 karakter yang disandikan latin1Ã
dan©
(hex:C3
danA9
)- 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 BY
mungkin 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