Kolasi mana yang harus saya pilih untuk situs web bahasa-muiti?

25

Apakah pemeriksaan memiliki pengaruh terhadap kecepatan permintaan? Apakah ukuran tabel berubah tergantung pada susunannya?

Jika saya ingin membangun situs web yang harus mendukung semua bahasa yang memungkinkan (mari kita ambil misalnya Google) yang akan menjadi susunan yang disarankan?

Saya perlu menyimpan karakter seperti 日本語, pencarian saya di situs web harus kembali somethinguntuk sóméthínginput, itu juga harus peka huruf besar-kecil.

Bagaimana saya tahu pilihan mana yang terbaik untuk diambil? Pemeriksaan mana yang lebih cocok dengan kasus ini?

BrunoLM
sumber
4
Anda mungkin ingin mengulangi pertanyaan itu sehingga kedengarannya tidak subyektif - pemeriksaan "terbaik" dengan ukuran apa? :)
TML
Judul baru itu jauh lebih baik
TML

Jawaban:

16

Secara umum, salah satu varian Unicode mungkin adalah yang terbaik untuk dukungan bahasa luas - UTF-8 akan menggunakan lebih sedikit memori per codepoint, dan dengan demikian akan memiliki sedikit keuntungan dalam setiap pengorbanan waktu / ruang yang Anda merasa perlu dibuat; namun, saya pikir ada beberapa bahasa / skrip yang lebih esoteris yang tidak bisa diwakili oleh UTF-8 (tapi saya tidak 100% yakin akan hal itu, saya belum melakukan studi mendalam mengenai masalah ini).

Artikel Wikipedia ini mungkin mencerahkan tentang dis / keuntungan masing-masing.

TML
sumber
Ya, UTF-8 dapat menangani 1,1 juta poin kode Unicode.
vz0
Terima kasih - saya pikir ada beberapa karakter Han atau sejenisnya yang tidak didukung di UTF-8, bagus untuk mendapat jawaban yang solid.
TML
8

Saya percaya bahwa Anda harus menggunakan pemeriksaan Unicode yang aksen dan tidak sensitif huruf. Silakan baca artikel MSDN Memilih Collation dan Menggunakan sql collations dan semua artikel yang ditautkan.

Marian
sumber
8

Saya pikir pertanyaan seperti yang dinyatakan (pada 2015-04-20, "Yang mana [...]") bukan apa yang dimaksud, mengingat bahwa jawaban yang diterima berbicara tentang penyandian daripada pemeriksaan. Biarkan saya menjawab pertanyaan yang disebutkan daripada yang dimaksudkan, hanya karena saya pikir itu menarik :-)

Wikipedia mengatakan "Collation adalah kumpulan informasi tertulis menjadi urutan standar". Dalam komputasi, collation telah mengambil arti "spesifikasi pesanan semacam itu". Dengan kata lain, collation adalah (atau menyiratkan) definisi fungsi perbandingan tiga arah.

Saya pikir jawaban singkatnya adalah "pasti mungkin". Setidaknya saya menyadari shenanigans berikut:

#!/usr/bin/python
name = u"Jonas K\xf6lker" # \xf6 is o-umlaut
enc = name.encode('utf-8')
assert len(name) == 12  # \xf6 is one character
assert len(enc) == 13   # but two bytes in utf-8

import locale
locale.setlocale(locale.LC_COLLATE, "da_DK.utf8") # works on my machine
long_form = locale.strxfrm(enc)
assert len(long_form) == 38

locale.strxfrmadalah fungsi yang Returns a string that behaves for cmp locale-aware, yaitu, mengkodekan string sedemikian rupa sehingga perbandingan leksikografi standar byte demi byte terhadap string lain yang disandikan akan menghasilkan hasil yang sama dengan membandingkan string sesuai dengan fungsi pengumpulan yang ditentukan oleh lokal.

Beberapa pengamatan: di da_DK.utf8, string ouüödiurutkan. Di de_DE.utf8, string oöuüdiurutkan. Perhatikan bahwa len(long_form) == 38dan 38> 13. (Panjangnya juga 38 in de_DE.utf8.)

Jika database Anda memiliki indeks pada beberapa bidang string, disusun menurut da_DK.utf8, itu mungkin secara internal melakukan sesuatu seperti strxfrmuntuk memiliki perbandingan sederhana. (Di sisi lain, disk lambat. Mungkin lebih cepat untuk mengindeks berdasarkan representasi yang lebih kompak, jika biaya perbandingan per karakter lebih tinggi daripada mengimbangi dengan membandingkan lebih sedikit karakter.)

Anda bertanya "Apakah sebuah collation memiliki pengaruh terhadap kecepatan query?", Yang saya yakin jawabannya adalah ya: collation "C" (alias "POSIX") hanya membandingkan nilai-nilai titik kode unicode, sedangkan Denmark ( da_DK.utf8) dan bahasa Jerman ( de_DE.utf8) melakukan sesuatu yang lebih rumit. Ini akan memiliki beberapa dampak pada kecepatan query, walaupun aku curiga itu tidak akan perlu dicemaskan.

"Apakah ukuran meja berubah tergantung pada susunannya?" - Saya dapat membayangkan memiliki indeks menurut satu pemeriksaan dan indeks yang berbeda sesuai dengan pemeriksaan yang lain, atau hanya satu dari dua indeks tersebut, dengan beberapa strxfrmtransformasi seperti diterapkan. Dalam skenario hipotetis itu, jika ada dua pemeriksaan dengan karakteristik ukuran yang berbeda, jawabannya adalah ya.

"Yang mana yang merupakan susunan yang direkomendasikan?" - Itu tergantung pada mengapa Anda perlu menyortir string. Jika hanya memiliki beberapa cara kanonik memesan string, saya mungkin akan pergi dengan "C". Jika itu untuk menyajikan data kepada pengguna dalam urutan diurutkan sesuai dengan harapan manusia, dan harapan itu dibentuk oleh budaya mereka, dan Anda ingin database (dan bukan lapisan lain) untuk melakukan penyortiran, mungkin Anda harus membangun satu indeks per collation , yaitu setidaknya satu menurut da_DK.utf8untuk Denmark dan satu menurut de_DE.utf8untuk Jerman. Saya pikir ini mungkin menjadi cukup besar cukup cepat.

Semua ini sangat tergantung pada cara kerja database Anda; Saya pikir itu melampaui SQL "standar" (lol!). Seperti biasa, lihat dokumentasi untuk sistem basis data spesifik Anda.

Jonas Kölker
sumber