Pertanyaan Apa perbedaan antara utf8_general_ci dan utf8_unicode_ci? [duplikat]


Kemungkinan Duplikat:
Apa perbedaan antara utf8_general_ci dan utf8_unicode_ci 

Saya punya dua opsi unicode yang terlihat menjanjikan untuk database mysql.

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

Bisakah Anda jelaskan apa perbedaan antara utf8_general_ci dan utf8_unicode_ci? Apa efek dari memilih salah satu dari yang lain ketika mendesain database?


76
2018-06-24 04:49


asal


Jawaban:


utf8_general_ci adalah sangat sederhana - dan pada Unicode, sangat rusak - collation, yang memberi hasil yang salah pada teks Unicode umum. Apa yang dilakukannya adalah:

  • mengkonversi ke Unicode normalisasi membentuk D untuk dekomposisi kanonik
  • menghapus karakter penggabungan apa pun
  • mengkonversi ke huruf besar

Ini tidak bekerja dengan benar pada Unicode, karena tidak memahami casing Unicode. Casing Unicode saja jauh lebih rumit daripada yang bisa ditangani oleh pendekatan ASCII. Sebagai contoh:

  • Huruf kecil “ẞ” adalah “ß”, tetapi huruf besar “ß” adalah “SS”.
  • Ada dua sigma Yunani huruf kecil, tetapi hanya satu huruf kapital; pertimbangkan “Σίσυφος”.
  • Huruf seperti "ø" tidak terurai menjadi "o" plus diakritik, yang berarti tidak akan disortir dengan benar.

Ada banyak seluk-beluk lainnya.

  1. utf8_unicode_ci menggunakan standar Algoritma Unicode Collation, mendukung apa yang disebut ekspansi dan ligatur, misalnya: Huruf Jerman ß (U + 00DF LETTER SHARP S) disortir di dekat "ss" Huruf Œ (U + 0152 LATIN MODAL LIGATURE OE) disortir di dekat "OE".

utf8_general_ci tidak mendukung ekspansi / ligatures, itu macam semua huruf ini sebagai karakter tunggal, dan terkadang dalam urutan yang salah.

  1. utf8_unicode_ci aku s umumnya lebih akurat untuk semua skrip. Misalnya, pada blok Cyrillic: utf8_unicode_ci tidak masalah untuk semua bahasa ini: Rusia, Bulgaria, Belarusia, Makedonia, Serbia, dan Ukraina. Sementara utf8_general_ci baik-baik saja hanya untuk bagian Cyrillic dari Rusia dan Bulgaria. Huruf tambahan yang digunakan dalam bahasa Belarusia, Makedonia, Serbia, dan Ukraina disortir tidak baik.

Biaya dari utf8_unicode_ci apakah itu a sedikit sedikit lebih lambat dari utf8_general_ci. Tetapi itulah harga yang Anda bayar untuk kebenaran. Entah Anda dapat memiliki jawaban cepat yang salah, atau jawaban yang sedikit lebih lambat yang benar. Pilihanmu.  Sangat sulit untuk membenarkan memberikan jawaban yang salah, jadi yang terbaik adalah menganggapnya utf8_general_ci tidak ada dan selalu digunakan utf8_unicode_ci. Nah, kecuali Anda menginginkan jawaban yang salah.

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


122
2018-06-24 04:55



Dari Set Karakter Unicode dalam Dokumentasi MySQL:

Untuk setiap set karakter Unicode, operasi yang dilakukan menggunakan _general_ci pemeriksaan lebih cepat daripada yang untuk _unicode_ci pemeriksaan. Sebagai contoh, perbandingan untuk utf8_general_ci pemeriksaan lebih cepat, tetapi sedikit kurang tepat, dibandingkan perbandingan utf8_unicode_ci. Alasan untuk ini adalah itu utf8_unicode_ci mendukung pemetaan seperti perluasan; yaitu, ketika satu karakter membandingkan sama dengan kombinasi karakter lain. Misalnya, dalam bahasa Jerman dan beberapa bahasa lainnya “ß" adalah sama dengan "ss". utf8_unicode_ci juga mendukung kontraksi dan karakter yang dapat diabaikan. utf8_general_ci adalah peninggalan warisan yang tidak mendukung ekspansi, kontraksi, atau karakter yang dapat diabaikan. Itu hanya dapat membuat perbandingan satu-ke-satu antar karakter.


19