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 something
für die sóméthíng
Eingabe 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?
performance
sql-server
collation
BrunoLM
quelle
quelle
Antworten:
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 .
quelle
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.
quelle
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:
locale.strxfrm
ist eine Funktion, dieReturns 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 Zeichenfolgeouüö
sortiert. Inde_DE.utf8
wird die Zeichenfolgeoöuü
sortiert. Beachten Sie, dasslen(long_form) == 38
und 38> 13. (Die Länge ist auch 38 inde_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 sostrxfrm
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 nachde_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.
quelle