Bạn bị "mã hóa kép".
Đây là những gì đã xảy ra.
- Máy khách có các ký tự được mã hóa là utf8; và
-
SET NAMES latin1nói dối bằng cách tuyên bố rằng khách hàng có mã hóa latin1; và - Cột trong bảng được khai báo
CHARACTER SET utf8.
Hãy xem qua những gì xảy ra với e-cấp tính:é .
- Hệ lục phân cho điều đó, tính bằng utf8 là 2 byte:
C3A9. -
SET NAMES latin1xem nó là 2 ký tự được mã hóa latin1Ãvà©(hex:C3vàA9) - Vì mục tiêu là
CHARACTER SET utf8, 2 ký tự đó cần được chuyển đổi.Ãđã được chuyển đổi thành utf8 (hexC383) và©(hexC2A9) - Vì vậy, 4 byte đã được lưu trữ (hex
C383C2A9)
Khi đọc ngược lại, các bước ngược lại đã được thực hiện và người dùng cuối có thể nhận thấy không có gì sai. Có gì sai:
- Dữ liệu được lưu trữ lớn gấp 2 lần (gấp 3 lần đối với các ngôn ngữ Châu Á).
- Các phép so sánh bằng, lớn hơn, v.v. có thể không hoạt động như mong đợi.
-
ORDER BYcó thể không hoạt động như mong đợi.
Một cái gì đó như thế này sẽ sửa chữa dữ liệu của bạn:
UPDATE ... SET col = CONVERT(BINARY(CONVERT(
CONVERT(UNHEX(col) USING utf8)
USING latin1)) USING utf8);
Thảo luận khác và Các ví dụ khác về cách khắc phục sự cố này