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 latin1
nó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 latin1
xem nó là 2 ký tự được mã hóa latin1Ã
và©
(hex:C3
và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 BY
có 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