Welche Kollatierung soll ich für eine Website in mehreren Sprachen wählen?

25

Hat eine Kollatierung Einfluss auf die Abfragegeschwindigkeit? Ändert sich die Größe einer Tabelle in Abhängigkeit von der Sortierung?

Wenn ich eine Website erstellen möchte, die alle möglichen Sprachen unterstützen muss (nehmen wir zum Beispiel Google), welche Sortierung wird empfohlen?

Ich muss Zeichen speichern, z. B. 日本語müssen meine Suchanfragen über die Website somethingfür die sóméthíngEingabe zurückgegeben werden, wobei die Groß- und Kleinschreibung ebenfalls nicht berücksichtigt werden muss.

Woher weiß ich, welche die beste Wahl ist? Welche Sortierung passt besser zu diesem Fall?

BrunoLM
quelle
4
Vielleicht möchten Sie die Frage umformulieren, damit sie nicht so subjektiv klingt - "beste" Sortierung nach welchem ​​Maß? :)
TML
Der neue Titel liest sich viel besser
TML

Antworten:

16

Im Allgemeinen ist eine der Unicode-Varianten wahrscheinlich die beste für eine breite Sprachunterstützung - UTF-8 wird weniger Speicher pro Codepunkt belegen und hat daher einen leichten Vorteil bei allen Zeit- / Raum-Kompromissen, die Sie eingehen müssen. Ich glaube jedoch, dass es einige der esoterischeren Sprachen / Skripte gibt, die UTF-8 nicht darstellen kann (aber da bin ich mir nicht hundertprozentig sicher, ich habe diesbezüglich noch keine umfassende Studie durchgeführt).

Dieser Wikipedia-Artikel beleuchtet möglicherweise die Nachteile / Vorteile der einzelnen Artikel .

TML
quelle
Ja, UTF-8 kann die 1,1 Millionen Unicode-Codepunkte verarbeiten.
vz0
Danke - Ich dachte, es gibt einige Han-Zeichen oder ähnliches, die in UTF-8 nicht unterstützt werden. Gut, dass ich eine solide Antwort habe.
TML
8

Ich bin der Meinung, dass Sie eine Unicode-Kollatierung verwenden sollten, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird. Bitte lesen Sie die MSDN-Artikel Auswählen von Kollatierungen und Verwenden von SQL-Kollatierungen sowie alle verknüpften Artikel.

Marian
quelle
8

Ich denke, die Frage, wie sie gestellt wurde (am 20.04.2015, "Welche Kollatierung [...]"), ist nicht gemeint, da die akzeptierte Antwort eher von Kodierung als von Kollatierung handelt. Lassen Sie mich die angegebene Frage beantworten und nicht die beabsichtigte, nur weil ich sie interessant finde :-)

Wikipedia sagt: "Kollation ist die Zusammenstellung schriftlicher Informationen zu einer Standardbestellung." Beim Rechnen hat die Sortierung die Bedeutung einer "Spezifikation einer solchen Bestellung" angenommen. Mit anderen Worten, eine Kollation ist (oder impliziert) eine Definition einer Drei-Wege-Vergleichsfunktion.

Ich denke, die kurze Antwort lautet "definitiv vielleicht". Zumindest sind mir folgende Spielereien bekannt:

#!/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.strxfrmist eine Funktion, die Returns a string that behaves for cmp locale-awareeine Zeichenfolge so codiert, dass ein byteweiser lexikografischer Vergleich mit einer anderen Zeichenfolge, die auf ähnliche Weise codiert wurde, dasselbe Ergebnis wie der Vergleich von Zeichenfolgen gemäß der durch das Gebietsschema angegebenen Kollatierungsfunktion liefert.

Einige Beobachtungen: In da_DK.utf8ist die Zeichenfolge ouüösortiert. In de_DE.utf8wird die Zeichenfolge oöuüsortiert. Beachten Sie, dass len(long_form) == 38und 38> 13. (Die Länge ist auch 38 in de_DE.utf8.)

Wenn Ihre Datenbank über einen Index für ein Zeichenfolgenfeld verfügt, das entsprechend sortiert ist da_DK.utf8, kann dies intern etwa so strxfrmsein, um einen einfachen Vergleich zu ermöglichen. (Auf der anderen Seite sind Festplatten langsam. Die Indizierung auf der Grundlage einer kompakteren Darstellung kann schneller sein, wenn die höheren Kosten für den Zeichenvergleich durch den Vergleich von weniger Zeichen mehr als ausgeglichen werden.)

Sie fragen "Hat eine Kollatierung einen Einfluss auf die Abfragegeschwindigkeit?", Und ich bin mir ziemlich sicher, dass die Antwort Ja lautet: Die Kollatierung "C" (auch bekannt als "POSIX") vergleicht nur Unicode-Codepunktwerte, während die da_DK.utf8) und Deutsch ( de_DE.utf8) machen etwas schwieriger. Dies hat einige Auswirkungen auf die Abfragegeschwindigkeit, obwohl ich vermute, dass es sich nicht lohnt, sich Sorgen zu machen.

"Ändert sich die Größe einer Tabelle in Abhängigkeit von der Sortierung?" - Ich kann mir vorstellen, einen Index nach einer Kollatierung und einen anderen Index nach einer anderen Kollatierung oder nur einen dieser beiden Indizes mit einer gewissen strxfrmTransformation anzuwenden. Wenn in diesem hypothetischen Szenario zwei Kollatierungen mit unterschiedlichen Größenmerkmalen vorliegen, lautet die Antwort Ja.

"Was wäre die empfohlene Zusammenstellung?" - Das hängt davon ab, warum Sie Zeichenfolgen sortieren müssen. Wenn es nur um einige kanonische Weise Saiten Bestellung, würde ich wahrscheinlich mit „C“ gehen. Wenn die Daten den Benutzern in sortierter Reihenfolge gemäß den Erwartungen des Menschen präsentiert werden sollen und diese Erwartungen von seiner Kultur geprägt sind und Sie möchten, dass die Datenbank (und nicht eine andere Ebene) die Sortierung durchführt, sollten Sie möglicherweise einen Index pro Kollatierung erstellen , dh mindestens eine nach da_DK.utf8für die Dänen und eine nach de_DE.utf8für die Deutschen. Ich denke jedoch, dass dies ziemlich schnell ziemlich groß werden könnte.

All dies hängt in hohem Maße von der Funktionsweise Ihrer Datenbank ab. Ich denke, es geht weit über "standardisiertes" (lol!) SQL hinaus. Konsultieren Sie wie immer die Dokumentation zu Ihrem spezifischen Datenbanksystem.

Jonas Kölker
quelle