Nếu bạn đã từng làm việc với MySQL, chắc chắn bạn đã gặp phải các bộ ký tự và đối chiếu. Trong bài đăng blog này, chúng tôi sẽ cố gắng cung cấp cho bạn cái nhìn sâu hơn về hai thứ đó là gì và bạn nên sử dụng chúng như thế nào.
Bộ ký tự và ghép là gì?
Nói một cách đơn giản, bộ ký tự trong MySQL là bộ ký hiệu và mã hóa - đối chiếu là bộ quy tắc để so sánh các ký tự trong một bộ ký tự. Nói cách khác, tập ký tự là tập hợp các ký tự hợp pháp trong một chuỗi, trong khi đối chiếu là một tập hợp các quy tắc được sử dụng để so sánh các ký tự trong một tập ký tự cụ thể. Chỉ cách mỗi bộ ký tự có một đối chiếu mặc định, các bộ ký tự cũng có thể có một số đối chiếu. MySQL có bộ ký tự và đối chiếu mặc định cho máy chủ cũng như cho từng cơ sở dữ liệu và bảng.
Bộ ký tự trong MySQL
Nói chung, các bộ ký tự trong MySQL hoạt động như vậy:
- Khi cơ sở dữ liệu được tạo, các bộ ký tự được bắt nguồn từ biến character_set_server trên toàn máy chủ.
- Khi một bảng được tạo, các bộ ký tự được lấy từ cơ sở dữ liệu.
- Khi một cột được tạo, các bộ ký tự sẽ bắt nguồn từ bảng.
Liên quan đến các bộ ký tự, có một số biến bạn nên theo dõi:
- Character_set_client xác định bộ ký tự trong đó ứng dụng khách gửi các câu lệnh.
- Character_set_connection xác định bộ ký tự mà các câu lệnh được dịch sang sau khi máy chủ nhận được một câu lệnh từ máy khách.
- Character_set_results xác định bộ ký tự trong đó máy chủ trả về kết quả truy vấn cho máy khách.
Ba cài đặt này có thể được thay đổi bằng cách sử dụng câu lệnh SET NAMES hoặc SET CHARACTER SET hoặc thậm chí trong các tệp cấu hình MySQL.
Khi xử lý các bộ ký tự, đôi khi bạn cũng có thể gặp phải lỗi # 1267:
ERROR 1267 (HY000): Illegal mix of collations.
Lỗi trên thường do so sánh hai chuỗi có đối chiếu không tương thích hoặc do cố gắng chọn dữ liệu có đối chiếu khác vào một cột kết hợp. Lỗi được hiển thị bởi vì khi MySQL so sánh hai giá trị với các bộ ký tự khác nhau, nó phải chuyển đổi chúng thành cùng một bộ ký tự để so sánh, nhưng các bộ ký tự không tương thích. Để giải quyết vấn đề này, hãy đảm bảo rằng các đối chiếu của mỗi bảng và các cột của chúng giống nhau.
Các ảnh ghép trong MySQL
Như đã đề cập ở trên, đối chiếu có liên quan chặt chẽ với các tập ký tự vì đối chiếu là một tập hợp các quy tắc xác định cách so sánh và sắp xếp các chuỗi ký tự. Mỗi bộ ký tự có ít nhất một đối chiếu, một số còn có nhiều hơn nữa.
Mặc dù chúng tôi sẽ không đi sâu vào chi tiết thực tế của tất cả những thứ liên quan đến đối chiếu trong MySQL trong bài đăng trên blog này, nhưng có một số điều bạn nên biết:
- Nếu bạn đang sử dụng MySQL 5.7, đối chiếu MySQL mặc định thường là latin1_swedish_ci vì MySQL sử dụng latin1 làm bộ ký tự mặc định của nó. Nếu bạn đang sử dụng MySQL 8.0, thì bộ ký tự mặc định là utf8mb4.
- Nếu bạn chọn sử dụng UTF-8 làm đối chiếu của mình, hãy luôn sử dụng utf8mb4 (cụ thể là utf8mb4_unicode_ci). Bạn không nên sử dụng UTF-8 vì UTF-8 của MySQL khác với mã hóa UTF-8 thích hợp. Trường hợp này xảy ra vì nó không cung cấp hỗ trợ unicode đầy đủ, điều này có thể dẫn đến mất dữ liệu hoặc các vấn đề bảo mật. Hãy nhớ rằng utf8mb4_general_ci là một tập hợp các quy tắc sắp xếp được đơn giản hóa sử dụng các phím tắt được thiết kế để cải thiện tốc độ trong khi utf8mb4_unicode_ci sắp xếp chính xác bằng nhiều ngôn ngữ. Nói chung, utf8mb4 là bộ ký tự “an toàn nhất” vì nó cũng hỗ trợ unicode 4 byte trong khi utf8 chỉ hỗ trợ tối đa 3.
Chọn bộ ký tự và đối chiếu tốt
Để chọn đối chiếu tốt và bộ ký tự cho tập dữ liệu MySQL của bạn, hãy nhớ giữ nó đơn giản. Sự kết hợp của các bộ ký tự và (hoặc) đối chiếu khác nhau có thể là một mớ hỗn độn thực sự vì chúng có thể rất khó hiểu (ví dụ:mọi thứ có thể hoạt động tốt cho đến khi một số ký tự nhất định xuất hiện, v.v.) vì vậy tốt nhất hãy đánh giá nhu cầu của bạn từ trước và chọn điều tốt nhất đối chiếu và thiết lập ký tự trước. MySQL cũng có một số truy vấn có giá trị có thể giúp bạn làm điều đó, ví dụ:
SELECT * FROM information_schema.CHARACTER_SETS ORDER BY CHARACTER_SET_NAME;
sẽ trả về danh sách các bộ ký tự và các ảnh ghép có sẵn cùng với mô tả của chúng, điều này có thể cực kỳ hữu ích nếu bạn đang lên kế hoạch thiết kế cơ sở dữ liệu của mình.
Hãy nhớ rằng một số bộ ký tự có thể yêu cầu nhiều hoạt động của CPU hơn, chúng cũng có thể tiêu tốn nhiều dung lượng lưu trữ hơn. Sử dụng sai bộ ký tự thậm chí có thể đánh bại việc lập chỉ mục - ví dụ:MySQL phải chuyển đổi bộ ký tự để có thể so sánh chúng khi chúng không giống nhau:việc chuyển đổi có thể khiến bạn không thể sử dụng chỉ mục.
Ngoài ra, hãy nhớ rằng một số người khuyên "chỉ nên sử dụng UTF-8 trên toàn cầu" - đây có thể không nhất thiết là một ý tưởng tuyệt vời vì nhiều ứng dụng thậm chí không cần UTF-8 và, tùy thuộc vào trên dữ liệu của bạn, UTF-8 có thể gây ra nhiều rắc rối hơn mức đáng có (ví dụ:nó có thể sử dụng nhiều dung lượng lưu trữ hơn trên đĩa), vì vậy hãy lựa chọn một cách khôn ngoan.
Tóm tắt
Các bộ ký tự và ảnh ghép có thể là bạn của bạn hoặc là một trong những cơn ác mộng của bạn - tất cả phụ thuộc vào cách bạn sử dụng chúng. Nói chung, hãy nhớ rằng một bộ ký tự và đối chiếu “tốt” phụ thuộc vào dữ liệu mà cơ sở dữ liệu của bạn nắm giữ - MySQL cung cấp một số truy vấn để giúp bạn quyết định sử dụng cái gì, nhưng để bộ ký tự và đối chiếu của bạn có hiệu quả, bạn cũng nên suy nghĩ về thời điểm hợp lý khi sử dụng một đối chiếu nhất định và tại sao.