Perbedaan antara utf8_general_ci dan utf8_unicode_ci

Perbedaan antara utf8_general_ci dan utf8_unicode_ci

iis

September 19, 2019

Kedua kumpulan ini keduanya untuk pengkodean karakter UTF-8. Perbedaannya terletak pada bagaimana teks diurutkan dan dibandingkan.

Catatan: Karena MySQL 5.5.3 Anda harus menggunakan utf8mb4 daripada utf8. Keduanya merujuk pada pengkodean UTF-8, tetapi utf8 yang lebih lama memiliki batasan spesifik-MySQL yang mencegah penggunaan karakter-karakter bernomor di atas 0xFFFD.

mysql

Perbedaan utama

utf8mb4_unicode_ci didasarkan pada aturan Unicode resmi untuk pengurutan dan perbandingan universal, yang mengurutkan secara akurat dalam berbagai bahasa.

utf8mb4_general_ci adalah seperangkat aturan penyortiran yang disederhanakan yang bertujuan untuk melakukan sebaik mungkin sambil mengambil banyak jalan pintas yang dirancang untuk meningkatkan kecepatan. Itu tidak mengikuti aturan Unicode dan akan menghasilkan penyortiran yang tidak diinginkan atau perbandingan dalam beberapa situasi, seperti ketika menggunakan bahasa atau karakter tertentu.

Pada server modern, peningkatan kinerja ini akan sangat kecil. Itu dirancang pada saat server memiliki sebagian kecil dari kinerja CPU komputer saat ini.

Catatan: sekarang ada versi terbaru utf8mb4_unicode_ci disebut utf8mb4_0900_ai_ci – ini didasarkan pada perubahan dalam Unicode versi 9.0, dan juga tampaknya lebih cepat. Ini mengadopsi skema penamaan baru di mana 0900 adalah versi Unicode dan ai berarti aksen-sensitif – seperti utf8mb4_unicode_ci sebelumnya, aksen dalam huruf tidak dianggap signifikan.

Manfaat utf8mb4_unicode_ci dibandingkan utf8mb4_general_ci

utf8mb4_unicode_ci, yang menggunakan aturan Unicode untuk menyortir dan membandingkan, menggunakan algoritma yang cukup kompleks untuk pengurutan yang benar dalam berbagai bahasa dan ketika menggunakan berbagai karakter khusus. Aturan-aturan ini perlu mempertimbangkan konvensi khusus bahasa akun; tidak semua orang mengurutkan karakter mereka dalam apa yang kita sebut ‘urutan alfabet’.

Sejauh bahasa Latin (yaitu “Eropa”) pergi, tidak ada banyak perbedaan antara penyortiran Unicode dan penyortiran utf8mb4_general_ci yang disederhanakan di MySQL, tetapi masih ada beberapa perbedaan:

Sebagai contoh, pemeriksaan Unicode mengurutkan “ß” seperti “ss”, dan “Œ” seperti “OE” seperti yang orang inginkan, sedangkan utf8mb4_general_ci mengurutkannya sebagai karakter tunggal (mungkin seperti “s” dan “e” secara berurutan) ).

Beberapa karakter Unicode didefinisikan sebagai diabaikan, yang berarti mereka tidak boleh diperhitungkan dalam urutan pengurutan dan perbandingan harus beralih ke karakter berikutnya. utf8mb4_unicode_ci menangani ini dengan benar.

Dalam bahasa non-latin, seperti bahasa Asia atau bahasa dengan huruf berbeda, mungkin ada lebih banyak perbedaan antara pengurutan Unicode dan pengurutan utf8mb4_general_ci yang disederhanakan. Kesesuaian utf8mb4_general_ci akan sangat bergantung pada bahasa yang digunakan. Untuk beberapa bahasa, itu akan sangat tidak memadai.

Apa yang harus Anda gunakan?

Hampir tidak ada alasan untuk menggunakan utf8mb4_general_ci lagi, karena kami telah meninggalkan titik di mana kecepatan CPU cukup rendah sehingga perbedaan kinerja akan menjadi penting. Basis data Anda hampir pasti akan dibatasi oleh kemacetan lain selain ini.

Di masa lalu, beberapa orang merekomendasikan untuk menggunakan utf8mb4_general_ci kecuali ketika penyortiran yang akurat akan menjadi cukup penting untuk membenarkan biaya kinerja. Saat ini, biaya kinerja telah hilang sama sekali, dan pengembang memperlakukan internasionalisasi dengan lebih serius.

Ada argumen yang dibuat bahwa jika kecepatan lebih penting bagi Anda daripada akurasi, Anda mungkin juga tidak melakukan penyortiran sama sekali. Ini sepele untuk membuat algoritma lebih cepat jika Anda tidak perlu akurat. Jadi, utf8mb4_general_ci adalah kompromi yang mungkin tidak diperlukan untuk alasan kecepatan dan mungkin juga tidak cocok untuk alasan akurasi.

Satu hal lagi yang akan saya tambahkan adalah bahwa meskipun Anda tahu aplikasi Anda hanya mendukung bahasa Inggris, mungkin masih harus berurusan dengan nama orang, yang sering kali dapat berisi karakter yang digunakan dalam bahasa lain di mana sama pentingnya untuk mengurutkan dengan benar . Menggunakan aturan Unicode untuk semuanya membantu menambah ketenangan pikiran bahwa orang-orang Unicode yang sangat pintar telah bekerja sangat keras untuk membuat penyortiran berfungsi dengan baik.

Apa arti bagian-bagian itu

Pertama, ci adalah untuk penyortiran dan perbandingan case-insensitive. Ini berarti cocok untuk data tekstual, dan kasus tidak penting. Tipe lain dari collation adalah cs (case-sensitive) untuk data tekstual di mana case adalah penting, dan bin, untuk tempat encoding harus cocok, bit for bit, yang cocok untuk bidang yang benar-benar dikodekan data biner (termasuk, untuk contoh, Base64). Penyortiran case-sensitive mengarah pada beberapa hasil yang aneh dan perbandingan case-sensitive dapat menghasilkan nilai duplikat yang berbeda hanya dalam case letter, sehingga pengumpulan case-sensitive tidak disukai untuk data tekstual – jika case penting bagi Anda, maka tanda baca yang dapat diabaikan dan seterusnya mungkin juga signifikan, dan pemeriksaan biner mungkin lebih tepat.

Selanjutnya, unicode atau umum mengacu pada aturan penyortiran dan perbandingan khusus – khususnya, cara teks dinormalisasi atau dibandingkan. Ada banyak set aturan yang berbeda untuk pengkodean karakter utf8mb4, dengan unicode dan umum adalah dua yang berusaha untuk bekerja dengan baik dalam semua bahasa yang mungkin daripada satu bahasa tertentu. Perbedaan antara kedua perangkat aturan ini adalah subjek dari jawaban ini. Perhatikan bahwa set aturan yang lebih baru termasuk 0900 merujuk ke Unicode 9.0, dan unicode_520 merujuk ke Unicode 5.2.

Dan terakhir, utf8mb4 tentu saja pengkodean karakter yang digunakan secara internal. Dalam jawaban ini saya hanya berbicara tentang pengkodean berbasis Unicode.