Câu hỏi Sự khác nhau giữa utf8_general_ci và utf8_unicode_ci là gì? [bản sao]


Có thể trùng lặp:
Sự khác nhau giữa utf8_general_ci và utf8_unicode_ci 

Tôi đã có hai tùy chọn cho unicode trông đầy hứa hẹn cho một cơ sở dữ liệu mysql.

utf8_general_ci unicode (multilingual), case-insensitive
utf8_unicode_ci unicode (multilingual), case-insensitive

Bạn có thể giải thích sự khác nhau giữa utf8_general_ci và utf8_unicode_ci không? Tác dụng của việc chọn cái này lên cái khác khi thiết kế một cơ sở dữ liệu là gì?


76
2018-06-24 04:49


gốc


Xem thêm stackoverflow.com/questions/766809/… - unor


Các câu trả lời:


utf8_general_ci là rất đơn giản - và trên Unicode, rất bị hỏng - collation, cái mà cung cấp 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 thành dạng chuẩn hóa Unicode D để phân tích chuẩn
  • loại bỏ bất kỳ ký tự kết hợp nào
  • chuyển đổi sang chữ hoa

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

  • Chữ thường của “ẞ” là “ß”, nhưng chữ hoa của “ß” là “SS”.
  • Có hai chữ sigma Hy Lạp chữ thường, nhưng chỉ có một chữ hoa; xem xét “Σίσυφος”.
  • 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 sắp xếp chính xác.

Có rất nhiều sự tinh tế khác.

  1. utf8_unicode_ci sử dụng tiêu chuẩn Unicode Collation Algorithm, hỗ trợ cái gọi là mở rộng và ligatures, ví dụ: Chữ cái tiếng Đức ß (U + 00DF LETTER SHARP S) được sắp xếp gần "ss" Thư Œ (U + 0152 LATIN CAPITAL LIGATURE OE) được sắp xếp gần "OE".

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

  1. utf8_unicode_ci Là 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 là tốt cho tất cả các ngôn ngữ này: Nga, Bungari, Belarus, Macedonia, Serbia và Ukraina. Mặc dù utf8_general_ci chỉ tốt cho tập hợp con Kirin của Nga và Bungari. Các chữ cái bổ sung được sử dụng bằng tiếng Belarus, tiếng Macedonia, tiếng Serbia và tiếng Ukraina được sắp xếp không tốt.

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

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


122
2018-06-24 04:55



Đạo cụ cho danh sách ngôn ngữ - reconbot
Có vẻ như câu trả lời này đã được sao chép thẳng từ diễn đàn mysql forums.mysql.com/read.php?103,187048,188748#msg-188748 - Matt
không ngăn bạn trích dẫn nguồn gốc khi bạn sao chép / dán câu trả lời: P - Matt
Tại sao bạn lại muốn sử dụng utf8_general_ci kết thúc utf8_unicode_ci, sau đó? - Buns Glazing
Không bao giờ sử dụng utf8_general_ci  http://stackoverflow.com/a/766996/570763 - Arda


Từ Bộ ký tự Unicode bên trong Tài liệu MySQL:

Đối với bất kỳ bộ ký tự Unicode nào, các thao tác được thực hiện bằng cách sử dụng _general_ci collation nhanh hơn so với _unicode_ci collation. Ví dụ: so sánh cho utf8_general_ci collation nhanh hơn, nhưng hơi kém chính xác hơn so với so sánh utf8_unicode_ci. Lý do cho điều này là utf8_unicode_ci hỗ trợ ánh xạ như mở rộng; có nghĩa là, khi một nhân vật so sánh bằng với sự kết hợp của các nhân vật khác. Ví dụ: bằng tiếng Đức và một số ngôn ngữ khác “ß" bằng "ss”. utf8_unicode_ci cũng hỗ trợ các co thắt và các ký tự không thể bỏ qua. utf8_general_ci là một đối chiếu kế thừa không hỗ trợ mở rộng, co thắt hoặc nhân vật có thể bỏ qua. Nó có thể chỉ thực hiện so sánh một-một giữa các ký tự.


19