Was bedeuten Zeichensatz und Sortierung genau?

314

Ich kann die MySQL- Dokumentation lesen und es ist ziemlich klar. Aber wie entscheidet man, welcher Zeichensatz verwendet werden soll? Auf welche Daten wirkt sich die Sortierung aus?

Ich bitte um eine Erklärung der beiden und wie man sie auswählt.

Schleifer Versluys
quelle

Antworten:

511

Aus MySQL- Dokumenten :

Ein Zeichensatz ist ein Satz von Symbolen und Codierungen. Eine Sortierung ist ein Satz von Regeln zum Vergleichen von Zeichen in einem Zeichensatz. Lassen Sie uns die Unterscheidung anhand eines Beispiels eines imaginären Zeichensatzes verdeutlichen.

Angenommen, wir haben ein Alphabet mit vier Buchstaben: 'A', 'B', 'a', 'b'. Wir geben jedem Buchstaben eine Zahl: 'A' = 0, 'B' = 1, 'a' = 2, 'b' = 3. Der Buchstabe 'A' ist ein Symbol, die Zahl 0 ist die Kodierung für 'A' und die Kombination aller vier Buchstaben und ihrer Kodierungen ist ein Zeichensatz.

Angenommen, wir möchten zwei Zeichenfolgenwerte vergleichen, 'A' und 'B'. Der einfachste Weg, dies zu tun, besteht darin, sich die Codierungen anzusehen: 0 für 'A' und 1 für 'B'. Da 0 kleiner als 1 ist, sagen wir, dass 'A' kleiner als 'B' ist. Was wir gerade getan haben, ist eine Kollatierung auf unseren Zeichensatz anzuwenden. Die Sortierung besteht aus einer Reihe von Regeln (in diesem Fall nur eine Regel): "Vergleichen Sie die Codierungen." Wir nennen diese einfachste aller möglichen Kollatierungen eine binäre Kollatierung.

Aber was ist, wenn wir sagen wollen, dass Klein- und Großbuchstaben gleichwertig sind? Dann hätten wir mindestens zwei Regeln: (1) Behandle die Kleinbuchstaben 'a' und 'b' als äquivalent zu 'A' und 'B'; (2) Vergleichen Sie dann die Codierungen. Wir nennen dies eine Kollatierung ohne Berücksichtigung der Groß- und Kleinschreibung. Es ist etwas komplexer als eine binäre Zusammenstellung.

Im wirklichen Leben haben die meisten Zeichensätze viele Zeichen: nicht nur 'A' und 'B', sondern ganze Alphabete, manchmal mehrere Alphabete oder östliche Schriftsysteme mit Tausenden von Zeichen, zusammen mit vielen speziellen Symbolen und Satzzeichen. Auch im wirklichen Leben haben die meisten Kollatierungen viele Regeln: nicht nur Groß- und Kleinschreibung, sondern auch Akzentunempfindlichkeit (ein "Akzent" ist eine Markierung, die einem Zeichen wie im deutschen 'ö' zugeordnet ist) und Zuordnungen mit mehreren Zeichen (wie die Regel, dass ' ö '=' OE 'in einer der beiden deutschen Zusammenstellungen).

Dan Esparza
quelle
206

Eine Zeichenkodierung ist eine Möglichkeit, Zeichen so zu kodieren, dass sie in den Speicher passen. Wenn der Zeichensatz ISO-8859-15 lautet, wird das Euro-Symbol € als 0xa4 und in UTF-8 als 0xe282ac codiert.

Die Sortierung dient zum Vergleichen von Zeichen. In lateinisch9 gibt es Buchstaben e é è ê f, die nach ihrer binären Darstellung sortiert sind. e f é ê èWenn die Sortierung beispielsweise auf Französisch eingestellt ist, werden sie in der Reihenfolge angezeigt, in der Sie sie gedacht haben wäre, was alle e é è êgleich sind, und dann f.

Matte
quelle
5
Es ist wichtig zu beachten, dass es für einen einzelnen Zeichensatz viele verschiedene Sortierungen geben kann. Diejenige, die "richtig" ist, hängt von der Semantik des Textes ab, die normalerweise durch die Sprache bestimmt wird, in der er geschrieben ist.
Phil
20

Ein Zeichensatz ist eine Teilmenge aller geschriebenen Glyphen. Eine Zeichenkodierung gibt an, wie diese Zeichen numerischen Werten zugeordnet werden. Einige Zeichenkodierungen, wie UTF-8 und UTF-16, können jedes Zeichen im universellen Zeichensatz codieren. Andere, wie US-ASCII oder ISO-8859-1, können nur eine kleine Teilmenge codieren, da sie 7 bzw. 8 Bit pro Zeichen verwenden. Da viele Standards sowohl einen Zeichensatz als auch eine Zeichenkodierung spezifizieren, wird der Begriff "Zeichensatz" häufig frei durch "Zeichenkodierung" ersetzt.

Eine Sortierung enthält Regeln, die angeben, wie Zeichen zum Sortieren verglichen werden können. Sortierregeln können länderspezifisch sein: Die richtige Reihenfolge von zwei Zeichen variiert von Sprache zu Sprache.

Die Auswahl eines Zeichensatzes und einer Sortierung hängt davon ab, ob Ihre Anwendung internationalisiert ist oder nicht. Wenn nicht, auf welches Gebietsschema zielen Sie ab?

Um auszuwählen, welchen Zeichensatz Sie unterstützen möchten, müssen Sie Ihre Anwendung berücksichtigen. Wenn Sie vom Benutzer bereitgestellte Eingaben speichern, ist es möglicherweise schwierig, alle Gebietsschemas vorherzusagen, in denen Ihre Software möglicherweise verwendet wird. Um sie alle zu unterstützen, ist es möglicherweise am besten, das BKS (Unicode) von Anfang an zu unterstützen. Dies ist jedoch mit Kosten verbunden. Viele westeuropäische Zeichen benötigen jetzt zwei Bytes Speicherplatz pro Zeichen anstelle von einem.

Die Auswahl der richtigen Sortierung kann die Leistung verbessern, wenn Ihre Datenbank die Sortierung zum Erstellen eines Index verwendet und diesen Index später verwendet, um sortierte Ergebnisse bereitzustellen. Da Kollatierungsregeln jedoch häufig länderspezifisch sind, ist dieser Index wertlos, wenn Sie die Ergebnisse nach den Regeln eines anderen Gebietsschemas sortieren müssen.

erickson
quelle
Entschuldigung, Alter, ich bin nur Anfänger und brauche nur deine Klarstellung. Kann ich die Kollatierung so verstehen, ist dies der Grund dafür, dass jedes Zeichen (entweder lateinisch oder chinesisch) richtig erkannt und entsprechend codiert wird. Ist das korrekt? Ich hoffe auf Ihre Antwort
Mirich
1
@Mirich Nein, die Sortierung enthält Informationen zum Sortieren von Zeichen. Verschiedene Regionen der Welt bevorzugen es, Zeichen auf unterschiedliche Weise zu sortieren.
Erickson
3

Ich empfehle die Verwendung utf8mb4_unicode_ci, die auf dem Unicode-Standard zum Sortieren und Vergleichen basiert und in einer Vielzahl von Sprachen genau sortiert.

simhumileco
quelle
3
vom OP: "Ich bitte um eine Erklärung der beiden und wie man sie
auswählt
1
@simhumileco, sorry Alter, ich bin nur Anfänger und brauche nur deine Klarstellung. Kann ich die Kollatierung so verstehen, ist dies der Grund dafür, dass jedes Zeichen (entweder lateinisch oder chinesisch) richtig erkannt und entsprechend codiert wird. Ist das korrekt? Ich hoffe auf Ihre Antwort
Mirich
1
@Mirich Es hängt alles davon ab, welche Codierung Sie an anderen Orten verwenden. Wenn Sie die UTF-8Codierung in einem System außerhalb der Datenbank verwenden, sollte alles in der Datenbank auch richtig geschrieben sein, wenn Sie utf8mb4in MySQL verwenden . Wenn es darum geht, Text für bestimmte Zeichen in MySQL richtig zu sortieren, zu vergleichen und zu transformieren , ist es schwierig, die perfekte Lösung zu finden, aber es *_unicode_ciist sicherlich besser als *_general, aber es hat auch seine Nachteile. Bitte lesen Sie: dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
simhumileco