Saya mencoba mencari tahu susunan apa yang harus saya gunakan untuk berbagai jenis data. 100% dari konten yang akan saya simpan dikirimkan oleh pengguna.
Pemahaman saya adalah bahwa saya harus menggunakan UTF-8 General CI (Case-Insensitive) daripada UTF-8 Binary. Namun, saya tidak dapat menemukan perbedaan yang jelas antara UTF-8 General CI dan UTF-8 Unicode CI.
- Haruskah saya menyimpan konten yang dikirimkan pengguna dalam kolom UTF-8 Umum atau UTF-8 Unicode CI?
- Tipe data apa yang akan diterapkan oleh UTF-8 Binary?
utf8
, gunakanutf8mb4
sebagai ganti untuk dukungan penuh UTF-8. Mengomentari di sini karena jawaban atas pertanyaan populer ini tidak membahas ini. mathiasbynens.be/notes/mysql-utf8mb4Jawaban:
Secara umum, utf8_general_ci lebih cepat dari utf8_unicode_ci , tetapi kurang tepat.
Inilah perbedaannya:
Dikutip dari: http://dev.mysql.com/doc/refman/5.0/id/charset-unicode-sets.html
Untuk penjelasan lebih rinci, silakan baca posting berikut dari forum MySQL: http://forums.mysql.com/read.php?103,187048,188748
Adapun utf8_bin: Baik utf8_general_ci dan utf8_unicode_ci melakukan perbandingan case-insensitive. Dalam konstrast , utf8_bin adalah case-sensitive (di antara perbedaan lainnya), karena membandingkan nilai biner dari karakter.
sumber
show collation;
memungkinkan Anda untuk melihat susunan default untuk setiap set karakter. 5.1 ditampilkanutf8_general_ci
sebagai default untukutf8
.Anda juga harus menyadari fakta, bahwa dengan utf8_general_ci saat menggunakan bidang varchar sebagai indeks utama atau unik memasukkan 2 nilai seperti 'a' dan 'á' akan memberikan kesalahan kunci duplikat.
sumber
utf8_unicode_ci
utf8_bin
membandingkan bit secara membabi buta. Tidak ada case lipat, tidak ada aksen stripping.utf8_general_ci
membandingkan satu byte dengan satu byte. Itu kasus lipat dan aksen stripping, tapi tidak ada perbandingan 2 karakter:ij
tidak samaij
dalam susunan ini.utf8_*_ci
adalah seperangkat aturan khusus bahasa, tetapi sebaliknya sukaunicode_ci
. Beberapa kasus khusus:Ç
,Č
,ch
,ll
utf8_unicode_ci
mengikuti standar Unicode lama untuk perbandingan.ij
=ij
, tapiae
! =æ
utf8_unicode_520_ci
mengikuti standar Unicode yang lebih baru.ae
=æ
Lihat bagan collation untuk perincian tentang apa yang sama dengan apa di berbagai collations utf8.
utf8
, seperti yang didefinisikan oleh MySQL terbatas pada kode utf8 1- hingga 3 byte. Ini meninggalkan Emoji dan beberapa orang Cina. Jadi Anda harus benar-benar beralih keutf8mb4
jika Anda ingin pergi jauh ke luar Eropa.Poin di atas berlaku untuk
utf8mb4
, setelah perubahan ejaan yang sesuai. Maju,utf8mb4
danutf8mb4_unicode_520_ci
lebih disukai.sumber
Sungguh, saya menguji nilai tabungan seperti 'é' dan 'e' di kolom dengan unik indeks dan mereka menyebabkan kesalahan duplikat pada 'utf8_unicode_ci' dan 'utf8_general_ci'. Anda dapat menyimpannya hanya di kolom susun 'utf8_bin'.
Dan dokumen mysql (di http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html ) menyarankan ke dalam contoh-contohnya set susunan 'utf8_general_ci'.
sumber
Jawaban yang diterima sudah usang.
Jika Anda menggunakan MySQL 5.5.3+, gunakan
utf8mb4_unicode_ci
alih-alihutf8_unicode_ci
untuk memastikan karakter yang diketik oleh pengguna Anda tidak akan memberi Anda kesalahan.utf8mb4
mendukung emoji misalnya, sedangkanutf8
mungkin memberi Anda ratusan bug terkait penyandian seperti:Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1
sumber
utf8mb4_unicode_ci
memperlakukan (saya pikir) semua Emoji sebagai sama.utf8mb4_unicode_520_ci
memberikan pemesanan ke Emoji.