Wenn Sie jemals mit MySQL gearbeitet haben, sind Sie unweigerlich auf Zeichensätze und Sortierungen gestoßen. In diesem Blog-Beitrag werden wir versuchen, Ihnen einen tieferen Einblick zu geben, was diese beiden sind und wie Sie sie verwenden sollten.
Was sind Zeichensätze und Sortierungen?
Einfach ausgedrückt sind Zeichensätze in MySQL Sätze von Symbolen und Kodierungen - Sortierungen sind Sätze von Regeln zum Vergleichen von Zeichen in einem Zeichensatz. Mit anderen Worten, Zeichensätze sind Sätze von Zeichen, die in einer Zeichenfolge zulässig sind, während Sortierungen ein Satz von Regeln sind, die zum Vergleichen von Zeichen in einem bestimmten Zeichensatz verwendet werden. So wie jeder Zeichensatz eine Standardsortierung hat, können Zeichensätze auch mehrere Sortierungen haben. MySQL hat einen Standardzeichensatz und eine Sortierung für den Server und auch für jede Datenbank und Tabelle.
Zeichensätze in MySQL
Im Allgemeinen funktionieren Zeichensätze in MySQL wie folgt:
- Wenn eine Datenbank erstellt wird, werden Zeichensätze von der serverweiten Variablen character_set_server abgeleitet.
- Wenn eine Tabelle erstellt wird, werden Zeichensätze aus der Datenbank abgeleitet.
- Wenn eine Spalte erstellt wird, werden Zeichensätze aus der Tabelle abgeleitet.
Was Zeichensätze betrifft, gibt es ein paar Variablen, die Sie im Auge behalten sollten:
- Character_set_client definiert den Zeichensatz, in dem Anweisungen vom Client gesendet werden.
- Character_set_connection definiert den Zeichensatz, in den Anweisungen übersetzt werden, nachdem ein Server eine Anweisung vom Client erhält.
- Character_set_results definiert den Zeichensatz, in dem der Server Abfrageergebnisse an den Client zurückgibt.
Diese drei Einstellungen können mit den SET NAMES- oder SET CHARACTER SET-Anweisungen oder sogar in den MySQL-Konfigurationsdateien geändert werden.
Beim Umgang mit Zeichensätzen kann es manchmal auch zu einem Fehler #1267:
kommenERROR 1267 (HY000): Illegal mix of collations.
Der obige Fehler wird im Allgemeinen durch den Vergleich zweier Zeichenfolgen mit inkompatiblen Sortierungen oder durch den Versuch verursacht, Daten mit einer anderen Sortierung in einer kombinierten Spalte auszuwählen. Der Fehler wird angezeigt, weil MySQL beim Vergleich zweier Werte mit unterschiedlichen Zeichensätzen diese für den Vergleich in denselben Zeichensatz konvertieren muss, die Zeichensätze aber nicht kompatibel sind. Um dieses Problem zu lösen, stellen Sie sicher, dass die Sortierungen jeder Tabelle und ihrer Spalten gleich sind.
Sortierungen in MySQL
Wie bereits oben erwähnt, sind Sortierungen eng mit Zeichensätzen verwandt, da eine Sortierung eine Reihe von Regeln ist, die definieren, wie Zeichenfolgen verglichen und sortiert werden. Jeder Zeichensatz hat mindestens eine Sortierung, einige haben auch mehr.
Während wir in diesem Blogeintrag nicht auf die wesentlichen Details aller Dinge eingehen werden, die mit der Sortierung in MySQL zu tun haben, gibt es einige Dinge, die Sie wissen sollten:
- Wenn Sie MySQL 5.7 verwenden, ist die standardmäßige MySQL-Sortierung im Allgemeinen latin1_swedish_ci, da MySQL latin1 als Standardzeichensatz verwendet. Wenn Sie MySQL 8.0 verwenden, ist der Standardzeichensatz utf8mb4.
- Wenn Sie UTF-8 als Sortierung verwenden möchten, verwenden Sie immer utf8mb4 (insbesondere utf8mb4_unicode_ci). Sie sollten UTF-8 nicht verwenden, da UTF-8 von MySQL sich von der richtigen UTF-8-Codierung unterscheidet. Dies ist der Fall, weil es keine vollständige Unicode-Unterstützung bietet, was zu Datenverlust oder Sicherheitsproblemen führen kann. Denken Sie daran, dass utf8mb4_general_ci ein vereinfachter Satz von Sortierregeln ist, die Abkürzungen verwenden, um die Geschwindigkeit zu verbessern, während utf8mb4_unicode_ci in einer Vielzahl von Sprachen genau sortiert. Im Allgemeinen ist utf8mb4 der „sicherste“ Zeichensatz, da er auch 4-Byte-Unicode unterstützt, während utf8 nur bis zu 3 unterstützt.
Auswahl eines guten Zeichensatzes und Sortierung
Um eine gute Sortierung und einen guten Zeichensatz für Ihren MySQL-Datensatz zu wählen, denken Sie daran, es einfach zu halten. Eine Mischung verschiedener Zeichensätze und (oder) Sortierungen kann ein echtes Durcheinander sein, da sie sehr verwirrend sein können (z. B. könnte alles gut funktionieren, bis bestimmte Zeichen erscheinen usw.). Daher ist es am besten, Ihre Bedürfnisse im Voraus zu bewerten und die besten auszuwählen Sortierung und Zeichensatz im Voraus. MySQL hat auch ein paar nützliche Abfragen, die Ihnen dabei helfen können, zum Beispiel
SELECT * FROM information_schema.CHARACTER_SETS ORDER BY CHARACTER_SET_NAME;
würde eine Liste von Zeichensätzen und verfügbaren Sortierungen zusammen mit ihrer Beschreibung zurückgeben, was äußerst nützlich sein kann, wenn Sie Ihr Datenbankdesign planen.
Denken Sie daran, dass einige Zeichensätze möglicherweise mehr CPU-Operationen erfordern und auch mehr Speicherplatz verbrauchen. Die Verwendung falscher Zeichensätze kann sogar die Indexierung zunichte machen - zum Beispiel muss MySQL Zeichensätze konvertieren, damit es sie vergleichen kann, wenn sie nicht gleich sind:Die Konvertierung könnte es unmöglich machen, einen Index zu verwenden.
Denken Sie auch daran, dass einige Leute empfehlen, „nur UTF-8 global zu verwenden“ – dies ist möglicherweise nicht unbedingt eine gute Idee, da viele Anwendungen UTF-8 überhaupt nicht benötigen und je nachdem Auf Ihre Daten kann UTF-8 mehr Probleme verursachen, als es wert ist (z. B. kann es viel mehr Speicherplatz auf der Festplatte beanspruchen), also wählen Sie es mit Bedacht aus.
Zusammenfassung
Zeichensätze und Sortierungen können Ihre Freunde oder einer Ihrer Alpträume sein – es hängt alles davon ab, wie Sie sie verwenden. Denken Sie im Allgemeinen daran, dass ein „guter“ Zeichensatz und eine Sortierung von den Daten abhängen, die Ihre Datenbank enthält – MySQL bietet einige Abfragen, die Ihnen bei der Entscheidung helfen, was Sie verwenden möchten, aber damit Ihre Zeichensätze und Sortierungen effektiv sind, sollten Sie auch nachdenken darüber, wann es sinnvoll ist, eine bestimmte Sortierung zu verwenden und warum.