Bir muiti dili web sitesi için hangi harmanlamayı seçmeliyim?


25

Bir harmanlamanın sorgu hızı üzerinde herhangi bir etkisi var mı? Bir tablonun boyutu harmanlamaya bağlı olarak değişiyor mu?

Tüm olası dilleri desteklemesi gereken bir web sitesi oluşturmak istersem (örneğin Google’a bakalım) hangisi önerilir?

Ben gibi karakterleri depolamak gerekir 日本語web sitesi üzerinden benim aramalar geri dönmek zorunda kalacak, somethingiçin sóméthíngo sıra harf duyarsız olmalı, giriş.

Hangisinin en iyi seçim olduğunu nasıl bilebilirim? Hangi harmanlama bu dava için daha uygun?


4
Soruyu, bu kadar öznel görünmeyecek şekilde tekrarlamak isteyebilirsiniz - hangi önlemle "en iyi" harmanlama? :)
TML

Yeni başlık çok daha iyi okuyor
TML

Yanıtlar:


16

Genel olarak konuşursak, Unicode varyantlarından biri muhtemelen geniş dil desteği için en iyisidir - UTF-8 kod noktası başına daha az bellek kullanacak ve bu sayede ihtiyaç duyduğunuz her türlü zaman / alan değişimlerinde küçük bir avantaja sahip olacak; Bununla birlikte, UTF-8'in temsil edemediği daha ezoterik dillerin / senaryoların olduğunu düşünüyorum (ancak bunun% 100 olduğundan emin değilim, konuyla ilgili ayrıntılı bir çalışma yapmadım).

Bu Wikipedia makalesi , her birinin dis / avantajlarını aydınlatıyor olabilir.


Evet, UTF-8, 1.1 milyon Unicode kod noktasını kaldırabilir.
vz0

Teşekkürler - UTF-8’de desteklenmeyen bazı Han karakterleri ya da benzeri şeyler olduğunu düşünmüştüm, sağlam bir cevap almak güzel.
TML


8

Bence belirtildiği gibi bir soru (2015-04-20, "Hangi harmanlama [...]") demek, kabul edilen cevabın harmanlamadan ziyade kodlamadan bahsettiği anlamına gelmediği anlamına gelmez. Belirtilen soruyu amaçlanandan çok cevaplayayım, çünkü ilginç olduğunu düşünüyorum :-)

Wikipedia “Harmanlama, yazılı bilgilerin standart bir düzende toplanmasıdır” diyor. Hesaplamada, harmanlama “böyle bir siparişin belirtilmesi” nin anlamını almıştır. Başka bir deyişle, bir harmanlama üç yönlü bir karşılaştırma işlevinin tanımıdır (veya ima eder).

Kısa cevap "kesinlikle belki" olduğunu düşünüyorum. En azından şu shenaniganların farkındayım:

#!/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.strxfrmbir fonksiyonudur Returns a string that behaves for cmp locale-awareolduğunu, başka bir dizgenin bir bayt-bayt standart lexicographic karşılaştırma yerel tarafından belirtildiği harmanlama fonksiyonuna göre dizeleri karşılaştırma aynı sonucu üretecektir benzer şekilde kodlanan bu şekilde bir dizi kodlar.

Bazı gözlemler: da_DK.utf8dize ouüösıralanır. İçinde de_DE.utf8, dize oöuüsıralanır. Şuna len(long_form) == 38ve 38> 13 olduğuna dikkat edin de_DE.utf8.

Veritabanınızın bazı dize alanında bir dizini varsa da_DK.utf8, buna göre harmanlanmışsa , basit bir karşılaştırma yapabilmek için dahili olarak bir şey yapıyor olabilirstrxfrm . (Öte yandan, diskler yavaştır. Karakter başına karşılaştırma maliyetinin daha az sayıda karakterle karşılaştırılarak dengelenmekten daha fazla olması durumunda, daha kompakt bir gösterime dayalı olarak indekslenmesi daha hızlı olabilir.)

"Bir harmanlamanın, sorgu hızı üzerinde herhangi bir etkisi var mı?" da_DK.utf8) ve Almanca ( de_DE.utf8) yerel yerler daha zor bir şey yapıyor. Bu olacak bazı ben buna değer endişesi olmayacak şüpheli rağmen, sorgu hızı üzerindeki etkisini.

"Bir tablonun büyüklüğü harmanlamaya bağlı olarak değişiyor mu?" - Bir harmanlamaya göre bir indeksi ve başka bir harmana göre farklı bir indeksi veya bazı iki strxfrmdönüşümden birini uygulayarak hayal edebilirim . Bu varsayımsal senaryoda, farklı boyut özelliklerine sahip iki harman varsa, cevabı evet.

"önerilen harmanlama hangisi olurdu?" - Bu neden dizeleri sıralamanız gerektiğine bağlı. O sahip olmak sadece buysa bazı dizeleri sipariş kanonik yolu, muhtemelen "C" ile gider. Kullanıcılara, insanın beklentilerine göre sıralama düzeninde veri sunmaksa ve bu beklentiler kültürleri tarafından şekillendiriliyorsa ve veritabanının (başka bir katmanın değil) sıralamayı yapmasını istiyorsanız, belki harmanlama başına bir dizin oluşturmalısınız. yani, en az bir da_DK.utf8Danimarkalılara göre, diğeri de_DE.utf8Almanlara göre. Bence bu oldukça hızlı bir şekilde oldukça büyüyebilir.

Bunların hepsi büyük ölçüde veritabanınızın iç işleyişine bağlıdır; Sanırım "standartlaştırılmış" (lol!) SQL'in ötesine geçiyor. Her zaman olduğu gibi, kendi veritabanı sisteminize ait belgelere bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.