Hôm nay có ông anh nhờ kiểm tra giúp vì cần xuất data từ hệ thống quản lý đơn hàng cũ sang Google Sheets, sử dụng App Scripts để truy cập database sau đó lấy dữ liệu insert ra google sheets, nhưng gặp phải lỗi sai kí tự tiếng Việt.
Bên Website vẫn hiện đúng, nhưng trong data hiển thị sai ví dụ:
- Chuyên mục sản phẩm “Bánh Nướng 4 Trứng” sẽ hiển thị là Bánh NÆ°á»›ng 4 Trứng
Sau khi kiểm tra thì thấy bên trong DB đã lưu sai như vậy chứ ko phải do cách insert phía google scripts, tìm hiểu tham khảo thấy bài viết giải thích về vấn đề này khá chi tiết trên StackOverFlow.
Như vậy chính xác vấn đề chúng ta cần giải quyết là trường hợp được gọi là Mojibake. Có từ khoá rồi, google sẽ ra cách fix phần data, nhưng để giải quyết triệt để thì cần fix 2 điểm:
1/ Sửa lỗi data hiện có
- Kiểm tra lại Character Set & Collation của các table / column bị lỗi. Chuyển thành utf8 – utf8_unicode_ci hoặc utf8mb4 – utf8mb4_general_ci / utf8mb4_unicode_ci
- Chạy MySQL Query để update lại data đã sai: (Thay table_name và column_name tương ứng)
UPDATE table_name SET column_name = CONVERT(BINARY CONVERT(column_name USING latin1) USING utf8);- (Lệnh tham khảo fix tại https://stackoverflow.com/questions/1476356/detecting-utf8-broken-characters-in-mysql)
Thành quả sau khi chạy lệnh, hú hồn!
2/ Sửa lỗi lưu từ phía code để data mới ko sai nữa
Cái này tuỳ vào source code tuy nhiên theo mình các framework mới, thông thường sẽ ko bị, source web cũ của ông anh dùng PHP5 và là code tự viết nên sẽ có nhiều khả năng, và trong trường hợp này là khai báo sai khi query MySQL, lỗi cũng khá phổ biến, nhưng cũng hơi khó nhận ra.
- Lệnh sai: mysql_query($this->conn,”SET NAMES ‘UTF-8‘”);
- Lệnh đúng: mysql_query($this->conn,”SET NAMES ‘UTF8‘”);
Test lại thêm dòng sản phẩm mới thấy dòng dữ liệu mới lưu đúng là tiếng Việt thì boom! Vậy là ổn rồi.