Character Set và Collation trong MySQL: Từ Lý Thuyết Đến Sự Cố Dữ Liệu Tiếng Nhật Thực Tế
Character Set Và Collation Trong MySQL Là Gì?
Trong hầu hết các dự án, charset/collation chỉ là hai dòng cấu hình mà framework đã set sẵn (utf8mb4, utf8mb4_unicode_ci) rồi không ai động vào nữa. Nhưng khi hệ thống bắt đầu xử lý:
- Japanese applications (ERP, e-commerce, product management)
- CSV import/export giữa nhiều nguồn dữ liệu
- Database migration từ hệ thống legacy sang hệ thống mới
- Integration giữa nhiều database khác version, khác charset
thì hai khái niệm tưởng chừng "chỉ là config" này có thể trở thành một business-critical concern. Một lựa chọn sai có thể gây ra:
❌ Cannot store character
❌ Garbled text (mojibake)
❌ Duplicate key không mong muốn
❌ Wrong search / JOIN result
❌ Illegal mix of collations
❌ Migration data inconsistency
Bài viết này đi qua toàn bộ chuỗi khái niệm — từ character, encoding, charset, collation — và kết thúc bằng một case study thực tế: một sự cố dữ liệu tiếng Nhật bị trùng lặp âm thầm trên một hệ thống legacy MySQL, và cách phân tích root cause để đưa ra quyết định migrate đúng đắn.
Có thể hình dung toàn bộ chuỗi khái niệm như sau:
Character → Encoding → Character Set → Collation → Comparison/Sorting → Index/UNIQUE/JOIN → Application Behavior
Character, Unicode Và Encoding: Nền Tảng Cần Hiểu Trước
Một character là một ký tự con người sử dụng: A, あ, 漢, 😀. Nhưng máy tính không lưu trực tiếp khái niệm "A" hay "漢" — nó chỉ lưu numbers/bytes. Do đó cần một cơ chế mapping: character → code point → bytes → lưu trong database.
Unicode là một standard gán một code point cho mọi character trên thế giới, ví dụ A là U+0041, あ là U+3042, 😀 là U+1F600. Unicode không phải là một encoding cụ thể — nó là "character vocabulary". Còn UTF-8, UTF-16, UTF-32 mới là các cách encode Unicode code points thành bytes thực tế.
Encoding quyết định một Unicode character được biểu diễn thành bao nhiêu bytes. UTF-8 là variable-length: một character có thể dùng từ 1 đến 4 bytes tùy loại ký tự:
| Ký tự | Loại | Số bytes (UTF-8) |
|---|---|---|
A |
English | 1 byte |
あ |
Japanese (Hiragana) | 3 bytes |
😀 |
Emoji | 4 bytes |
Đây chính là lý do tên gọi utf8mb3 và utf8mb4 có ý nghĩa: mb3 = tối đa 3 bytes/character, mb4 = tối đa 4 bytes/character.
Yêu cầu đăng nhập
Vui lòng đăng nhập để truy cập nội dung này
Additional Resources
Course Guide
Comprehensive PDF guide with examples
GitHub Repository
Example code for all lessons
Discussion
Have a question about this lesson? Post it here and get answers from instructors and peers.
