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ì?
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.
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.
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
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ự.