Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apa perbedaan antara utf8_general_ci dan utf8_unicode_ci?

Bagi orang-orang yang masih sampai pada pertanyaan ini pada tahun 2020 atau lebih baru, ada opsi yang lebih baru yang mungkin lebih baik daripada keduanya ini. Misalnya, utf8mb4_0900_ai_ci .

Semua susunan ini untuk pengkodean karakter UTF-8. Perbedaannya terletak pada cara teks diurutkan dan dibandingkan.

_unicode_ci dan _general_ci adalah dua set aturan yang berbeda untuk menyortir dan membandingkan teks sesuai dengan cara yang kita harapkan. Versi MySQL yang lebih baru juga memperkenalkan seperangkat aturan baru, seperti _0900_ai_ci untuk aturan yang setara berdasarkan Unicode 9.0 - dan tanpa _general_ci equivalent yang setara varian. Orang yang membaca ini sekarang mungkin harus menggunakan salah satu dari kumpulan yang lebih baru ini daripada _unicode_ci atau _general_ci . Deskripsi kumpulan lama di bawah ini disediakan untuk kepentingan saja.

MySQL saat ini beralih dari implementasi UTF-8 yang lebih lama dan cacat. Untuk saat ini, Anda perlu menggunakan utf8mb4 bukannya utf8 untuk bagian pengkodean karakter, untuk memastikan Anda mendapatkan versi tetap. Versi yang cacat tetap ada untuk kompatibilitas mundur, meskipun sudah tidak digunakan lagi.

Perbedaan utama

  • utf8mb4_unicode_ci didasarkan pada aturan Unicode resmi untuk penyortiran 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 atau perbandingan yang tidak diinginkan dalam beberapa situasi, seperti saat menggunakan bahasa atau karakter tertentu.

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

Manfaat utf8mb4_unicode_ci melalui utf8mb4_general_ci

utf8mb4_unicode_ci , yang menggunakan aturan Unicode untuk pengurutan dan perbandingan, menggunakan algoritme yang cukup rumit untuk pengurutan yang benar dalam berbagai bahasa dan saat menggunakan berbagai karakter khusus. Aturan-aturan ini perlu mempertimbangkan konvensi khusus bahasa; tidak semua orang mengurutkan karakter mereka dalam apa yang kita sebut 'urutan abjad'.

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

  • Misalnya, susunan Unicode mengurutkan "ß" seperti "ss", dan "Œ" seperti "OE" seperti yang biasanya diinginkan orang yang menggunakan karakter tersebut, sedangkan utf8mb4_general_ci mengurutkannya sebagai karakter tunggal (mungkin seperti "s" dan "e").

  • Beberapa karakter Unicode didefinisikan sebagai ignorable, yang berarti karakter tersebut tidak boleh diperhitungkan dalam urutan pengurutan dan perbandingannya harus beralih ke karakter berikutnya. utf8mb4_unicode_ci menangani ini dengan benar.

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

Apa yang harus Anda gunakan?

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

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

Ada argumen yang dibuat bahwa jika kecepatan lebih penting bagi Anda daripada akurasi, Anda sebaiknya tidak melakukan penyortiran sama sekali. Ini sepele untuk membuat algoritma lebih cepat jika Anda tidak membutuhkannya untuk menjadi akurat. Jadi, utf8mb4_general_ci adalah kompromi yang mungkin tidak diperlukan karena 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, itu mungkin masih harus berurusan dengan nama orang, yang sering kali dapat berisi karakter yang digunakan dalam bahasa lain yang sama pentingnya untuk mengurutkan dengan benar. . Menggunakan aturan Unicode untuk semuanya membantu menambah ketenangan pikiran bahwa orang-orang Unicode yang sangat cerdas telah bekerja sangat keras untuk membuat penyortiran bekerja dengan benar.

Apa arti bagian-bagiannya

Pertama, ci adalah untuk peka huruf besar/kecil pengurutan dan perbandingan. Ini berarti cocok untuk data tekstual, dan huruf besar/kecil tidak penting. Jenis susunan lainnya adalah cs (peka huruf besar/kecil) untuk data tekstual yang menggunakan huruf besar/kecil, dan bin , di mana pengkodean harus cocok, bit demi bit, yang cocok untuk bidang yang benar-benar data biner yang disandikan (termasuk, misalnya, Base64). Penyortiran peka huruf besar/kecil mengarah ke beberapa hasil yang aneh dan perbandingan peka huruf besar/kecil dapat menghasilkan nilai duplikat yang berbeda hanya dalam huruf besar/kecil, sehingga susunan huruf besar/kecil tidak disukai untuk data tekstual - jika huruf besar/kecil penting bagi Anda, maka tanda baca yang tidak dapat diabaikan dan seterusnya mungkin juga signifikan, dan susunan biner mungkin lebih tepat.

Selanjutnya, unicode atau general mengacu pada aturan penyortiran dan perbandingan tertentu - khususnya, cara teks dinormalisasi atau dibandingkan. Ada banyak set aturan yang berbeda untuk pengkodean karakter utf8mb4, dengan unicode dan general menjadi dua yang berusaha untuk bekerja dengan baik dalam semua bahasa yang mungkin daripada satu bahasa tertentu. Perbedaan antara dua set aturan ini adalah subjek dari jawaban ini. Perhatikan bahwa unicode menggunakan aturan dari Unicode 4.0. Versi terbaru MySQL menambahkan kumpulan aturan unicode_520 menggunakan aturan dari Unicode 5.2, dan 0900 (menjatuhkan bagian "unicode_") menggunakan aturan dari Unicode 9.0.

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa melindungi nama pengguna dan kata sandi MySQL dari dekompilasi?

  2. Bagaimana cara menonaktifkan caching SQLAlchemy?

  3. Mysql menyisipkan datetime acak dalam rentang datetime tertentu

  4. Bagaimana Saya Dapat Menyetel Nilai Default Kolom Timestamp ke Timestamp Saat Ini dengan Laravel Migrations?

  5. slash sebelum setiap masalah kutipan