Khi dữ liệu bị mã hóa sai (ví dụ: lưu UTF-8 nhưng đọc như latin1), dùng CONVERT() lồng nhau với từ khóa binary để khôi phục.
Cú pháp
SELECT CONVERT(BINARY CONVERT(ten_cot USING latin1) USING utf8) AS ten_moi FROM ten_bang;
Giải thích quy trình
CONVERT(ten_cot USING latin1): Giải thích bytes hiện tại theo latin1BINARY ...: Ép kiểu sang binary string (giữ nguyên bytes)CONVERT(... USING utf8): Giải thích bytes đó theo UTF-8
Ví dụ minh họa
Tạo bảng và chèn dữ liệu bị mã hóa sai (hiển thị ’ thay cho '):
mysql> CREATE TABLE UtfDemo (
-> Id INT NOT NULL AUTO_INCREMENT,
-> Ten VARCHAR(15),
-> PRIMARY KEY(Id)
-> );
mysql> INSERT INTO UtfDemo(Ten) VALUES('Obama’s'), ('John’s'), ('Carol’s'), ('Sam’s');
Dữ liệu hiển thị sai:
+----+----------------+ | Id | Ten | +----+----------------+ | 1 | Obama’s | | 2 | John’s | | 3 | Carol’s | | 4 | Sam’s | +----+----------------+
Sửa encoding
mysql> SELECT CONVERT(BINARY CONVERT(Ten USING latin1) USING utf8) AS TenDung
-> FROM UtfDemo;
Kết quả đúng:
+------------+ | TenDung | +------------+ | Obama’s | | John’s | | Carol’s | | Sam’s | +------------+
Lưu ý: MySQL 8.0+ mặc định dùng utf8mb4. Thay utf8 bằng utf8mb4 để hỗ trợ emoji và ký tự 4-byte.