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 something
untuk sóméthíng
input, itu juga harus peka huruf besar-kecil.
Bagaimana saya tahu pilihan mana yang terbaik untuk diambil? Pemeriksaan mana yang lebih cocok dengan kasus ini?
performance
sql-server
collation
BrunoLM
sumber
sumber
Jawaban:
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.
sumber
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.
sumber
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:
locale.strxfrm
adalah fungsi yangReturns 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
, stringouüö
diurutkan. Dide_DE.utf8
, stringoöuü
diurutkan. Perhatikan bahwalen(long_form) == 38
dan 38> 13. (Panjangnya juga 38 inde_DE.utf8
.)Jika database Anda memiliki indeks pada beberapa bidang string, disusun menurut
da_DK.utf8
, itu mungkin secara internal melakukan sesuatu sepertistrxfrm
untuk 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
strxfrm
transformasi 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.utf8
untuk Denmark dan satu menurutde_DE.utf8
untuk 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.
sumber