Sửa lỗi font tiếng Việt trong MySQL và phpMyAdmin

phpMyAdmin, file SQL hay ứng dụng của bạn hiện Tiếng Việt hoặc ??? thay cho Tiếng Việt? Thường là bảng, kết nối và lúc nhập dữ liệu dùng bảng mã không khớp nhau. Mojibuster sửa file xuất ngay trong trình duyệt – sau đó bạn cấu hình MySQL cho đúng để không bị lại.

Hỗ trợ văn bản và các file sau:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Ví dụ file xuất từ Excel, bản sao cơ sở dữ liệu, phụ đề hoặc mã nguồn trang web.

Sửa lỗi

  1. Kéo file vào hoặc dán văn bản
  2. Tự động sửa
  3. Sao chép hoặc tải về
hoặc kéo file vào đây
  • Không tải lên. File được sửa ngay trong trình duyệt và không rời khỏi thiết bị của bạn.

  • Máy chủ tại EU. Mojibuster chạy trên máy chủ ở Phần Lan (EU), vì vậy Quy định chung về bảo vệ dữ liệu (GDPR) được áp dụng. Toàn văn GDPR (EUR-Lex, tiếng Anh)

Ba chỗ MySQL cần đến bảng mã

  • Cột hoặc bảng: bộ ký tự dùng để lưu dữ liệu, như utf8mb4 hay latin1.
  • Kết nối: bộ ký tự máy khách và máy chủ dùng để trao đổi – đặt bằng SET NAMES utf8mb4 hoặc trong cấu hình kết nối.
  • File: bảng mã dùng để đọc file nhập hoặc ghi file xuất – trong phpMyAdmin là mục Bộ ký tự của file (Character set of the file).

Nếu ba nơi này không khớp, ký tự sẽ hỏng. Trường hợp hay gặp nhất: văn bản UTF-8 được ghi qua kết nối latin1 vào cột latin1. Ứng dụng nhìn vẫn bình thường, nhưng phpMyAdmin và file xuất lại hiện tiếng Việt bị vỡ chữ.

Một dòng trong file CSV xuất từ phpMyAdmin

Trước

"1","NguyÔn ThÞ H­¬ng","§­êng Lª Lîi","Hµ Néi"

Sau

"1","Nguyễn Thị Hương","Đường Lê Lợi","Hà Nội"

Kiểm tra bộ ký tự

  • SHOW VARIABLES LIKE 'character_set%'; cho biết cấu hình của máy chủ và kết nối.
  • SHOW CREATE TABLE customers; cho biết bộ ký tự của bảng và các cột.
  • SELECT name, HEX(name) FROM customers LIMIT 5; cho thấy byte thật: trong cột utf8mb4, chữ ế là E1BABF, còn C3A1C2BAC2BF là chữ đã bị mã hóa hai lần.

Sửa file xuất hoặc bản sao lưu

  1. Xuất bảng trong phpMyAdmin dưới dạng SQL hoặc CSV – hoặc dùng mysqldump --default-character-set=utf8mb4.
  2. Thả file vào ô phía trên. Mojibuster chỉ sửa những chỗ hỏng, ký tự đúng được giữ nguyên.
  3. Xem các chỗ đã sửa trong mục Đã thay đổi gì? rồi tải file xuống.
  4. Nhập vào bảng utf8mb4 và chọn utf-8 làm bộ ký tự trong hộp thoại nhập.
  5. Thử trên bản sao trước khi thay bảng thật.

File xuất không bao giờ rời khỏi máy bạn – điều quan trọng với dữ liệu khách hàng. Nếu dữ liệu là chữ Việt kiểu cũ (TCVN3, VNI), xem thêm sửa lỗi font tiếng Việt.

Xử lý tận gốc

  • Tạo bảng mới với DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci.
  • Đặt kết nối của ứng dụng là utf8mb4, ví dụ trong PHP thêm charset=utf8mb4 vào DSN của PDO.
  • Nếu byte UTF-8 nằm trong cột latin1, đừng đổi thẳng bằng CONVERT TO – nó mã hóa lần hai và làm chữ hỏng thêm. Cách an toàn đi qua kiểu nhị phân: trước hết MODIFY name VARBINARY(255), sau đó MODIFY name VARCHAR(255) CHARACTER SET utf8mb4.
  • Nếu MySQL thay ký tự bằng ?, cột hoặc kết nối không biểu diễn được chúng. Dữ liệu đã lưu như vậy là mất hẳn – xem thêm mojibake là gì.

Câu hỏi thường gặp

Vì sao ứng dụng của tôi hiển thị đúng mà phpMyAdmin lại sai?

Vì ứng dụng và cơ sở dữ liệu cùng sai hai lần: ứng dụng ghi UTF-8 qua kết nối latin1 rồi đọc lại theo cách đó. phpMyAdmin kết nối đúng nên hiện đúng những gì thực sự được lưu. Nếu chữ đã lỗi hai lần, xem lỗi font hai lần; với file sao lưu WordPress, xem lỗi font WordPress và CSDL.

Nên dùng collation nào cho tiếng Việt?

utf8mb4_unicode_ci phù hợp với hầu hết ứng dụng; từ MySQL 8 mặc định là utf8mb4_0900_ai_ci. Quan trọng hơn là bộ ký tự utf8mb4, không phải utf8 – loại này không lưu được emoji trong MySQL.

MariaDB có dùng được không?

Có. MariaDB xử lý bộ ký tự giống MySQL và các lệnh là như nhau.

File sao lưu được lớn tối đa bao nhiêu?

Tối đa 100 MB mỗi file. Với cơ sở dữ liệu lớn hơn, hãy xuất từng bảng một.

Hướng dẫn khác