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ư
utf8mb4haylatin1. - Kết nối: bộ ký tự máy khách và máy chủ dùng để trao đổi – đặt bằng
SET NAMES utf8mb4hoặ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ữ.
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ộtutf8mb4, chữếlàE1BABF, cònC3A1C2BAC2BFlà chữ đã bị mã hóa hai lần.
Sửa file xuất hoặc bản sao lưu
- Xuất bảng trong phpMyAdmin dưới dạng SQL hoặc CSV – hoặc dùng
mysqldump --default-character-set=utf8mb4. - Thả file vào ô phía trên. Mojibuster chỉ sửa những chỗ hỏng, ký tự đúng được giữ nguyên.
- Xem các chỗ đã sửa trong mục Đã thay đổi gì? rồi tải file xuống.
- Nhập vào bảng
utf8mb4và chọnutf-8làm bộ ký tự trong hộp thoại nhập. - 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êmcharset=utf8mb4vào DSN của PDO. - Nếu byte UTF-8 nằm trong cột
latin1, đừng đổi thẳng bằngCONVERT 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ếtMODIFY 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.