Trong một số database cũ, dữ liệu thường được lưu bằng bảng mã latin1. Khi ứng dụng chuyển sang dùng utf8, nội dung tiếng Việt hoặc các ký tự đặc biệt có thể bị lỗi hiển thị.

Nếu dữ liệu trong cột đang bị đọc sai do được lưu theo latin1, bạn có thể chuyển lại nội dung sang utf8 bằng hàm CONVERT() của MySQL.

Câu lệnh chuyển mã

CONVERT(CAST(CONVERT(content USING latin1) AS BINARY) USING utf8)

Trong đó:

  • content là tên cột cần chuyển đổi.
  • CONVERT(content USING latin1) yêu cầu MySQL đọc dữ liệu theo bảng mã latin1.
  • CAST(... AS BINARY) giữ nguyên chuỗi byte gốc.
  • CONVERT(... USING utf8) chuyển chuỗi đó sang utf8.

Ví dụ cập nhật dữ liệu

UPDATE table_nameSET content = CONVERT(CAST(CONVERT(content USING latin1) AS BINARY) USING utf8);

Thay:

  • table_name bằng tên bảng.
  • content bằng tên cột cần chuyển mã.

Nên kiểm tra trước khi cập nhật

Trước khi chạy lệnh UPDATE, nên kiểm tra kết quả bằng SELECT trước:

SELECT content,       CONVERT(CAST(CONVERT(content USING latin1) AS BINARY) 
USING utf8) AS converted_contentFROM table_nameLIMIT 10;

Lưu ý quan trọng

Câu lệnh trên chỉ phù hợp khi dữ liệu gốc thực tế được lưu theo latin1 nhưng cần chuyển sang utf8.

Nếu dữ liệu đã đúng chuẩn utf8, việc chuyển đổi lại có thể làm nội dung bị lỗi.

Vì vậy, nên sao lưu database trước khi thực hiện cập nhật hàng loạt.