Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Sự khác biệt giữa utf8_general_ci và utf8_unicode_ci là gì?

utf8_general_ci là một đối chiếu rất đơn giản - và trên Unicode, rất bị hỏng -, một đối chiếu cho kết quả không chính xác trên văn bản Unicode chung. Những gì nó làm là:

  • chuyển đổi sang dạng chuẩn hóa Unicode D để phân tách hợp quy
  • xóa mọi ký tự kết hợp
  • chuyển đổi thành chữ hoa

Điều này không hoạt động chính xác trên Unicode, vì nó không hiểu cách viết hoa Unicode. Riêng cách viết hoa Unicode thì phức tạp hơn nhiều so với cách tiếp cận chú trọng đến ASCII có thể xử lý. Ví dụ:

  • Chữ thường của “ẞ” là “ß”, nhưng chữ hoa của “ß” là “SS”.
  • Có hai ký hiệu Hy Lạp viết thường, nhưng chỉ có một ký hiệu viết hoa một; coi “Σίσυφος”.
  • Các chữ cái như “ø” không phân tách thành chữ “o” cộng với dấu phụ, nghĩa là nó sẽ không được sắp xếp chính xác.

Có nhiều điều tinh tế khác.

  1. utf8_unicode_ci sử dụng Thuật toán đối chiếu Unicode tiêu chuẩn , hỗ trợ cái gọi là mở rộng và chữ ghép, ví dụ:chữ cái tiếng Đức ß (U + 00DF LETTER SHARP S) được sắp xếp gần "ss" Chữ Œ (U + 0152 LATIN CHỮ HOA OE) được sắp xếp gần "OE".

utf8_general_ci không hỗ trợ mở rộng / chữ ghép, nó sắp xếp các chữ cái này thành các ký tự đơn lẻ và đôi khi theo thứ tự sai.

  1. utf8_unicode_ci nói chung là chính xác hơn cho tất cả các tập lệnh. Ví dụ:trên khối Cyrillic:utf8_unicode_ci Sử dụng được cho tất cả các ngôn ngữ sau:tiếng Nga, tiếng Bungari, tiếng Belarus, tiếng Macedonian, tiếng Serbia và tiếng Ukraina. Trong khi utf8_general_ci chỉ sử dụng được cho tập hợp con chữ Cyrillic của tiếng Nga và tiếng Bungari. Các chữ cái Extra được sử dụng trong tiếng Belarus, Macedonian, Serbia và Ukrainianare được sắp xếp không tốt.

Chi phí của utf8_unicode_ci đó có phải là một ít bit thấp hơn utf8_general_ci . Nhưng đó là cái giá bạn phải trả cho sự đúng đắn. Bạn có thể có một câu trả lời nhanh là sai hoặc một câu trả lời chậm hơn một chút là đúng. Lựa chọn của bạn. Rất khó để biện minh cho việc đưa ra câu trả lời sai, vì vậy tốt nhất bạn nên giả định rằng utf8_general_ci không tồn tại và luôn sử dụng utf8_unicode_ci . Chà, trừ khi bạn muốn có câu trả lời sai.

Nguồn: http://forums.mysql.com/read .php? 103,187048,188748 # msg-188748



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể kết nối với MySQL 4.1+ bằng xác thực cũ

  2. MySQL tách các ký tự không phải số để so sánh

  3. Trong MySQL, tôi có nên trích dẫn số hay không?

  4. CURRENT_TIME Ví dụ - MySQL

  5. Cách hiển thị hình ảnh từ cơ sở dữ liệu bằng php