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.strxfrm
ist eine Funktion, die Returns a string that behaves for cmp locale-aware
eine 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.utf8
ist die Zeichenfolge ouüö
sortiert. In de_DE.utf8
wird die Zeichenfolge oöuü
sortiert. Beachten Sie, dass len(long_form) == 38
und 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 strxfrm
sein, 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 strxfrm
Transformation 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.utf8
für die Dänen und eine nach de_DE.utf8
fü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.