2016-06-19 10 views
-1

Ich habe festgestellt, dass mein Schema keine Zeichenfolgen mit regionalen Zeichen wie è, ù und anderen Akzenten oder Symbolen ausgeben kann.MySQL: Welche Standardsortierung sollte ich einstellen, um alle europäischen Zeichen abzudecken?

Die Manager-App ist ein Java-Servlet, es hat keine solchen Probleme. Es verwendet den JDBC-Treiber. Also dachte ich, die Ursache könnte folgende Standardsortierung sein: utf8 - utf8_general_ci.

Nach einer Recherche entdeckte ich, dass diese Zeichen nicht innerhalb der utf8 Bytes gespeichert werden können. Sollte ich utf8-mb4, utf-16, utf-32 oder eine andere verwenden? Welches ist das minimal beste, um alle europäischen Zeichen zu unterstützen (keine kyrillischen, arabischen und asiatischen)?

Zum Beispiel schlägt diese gewählte Antwort utf8mb4_unicode vor, aber ich sehe nicht, ob es wirklich das minimale Beste ist, um alle Charaktere abzudecken, die ich brauche.

What's the difference between utf8_general_ci and utf8_unicode_ci

+0

Eine Sortierfolge wird zum Sortieren/Vergleichen von Zeichenfolgen verwendet. Ein Encoding/Zeichensatz wird verwendet, um Zeichen in Bytes zu codieren.UTF8 ist eine Kodierung und unterstützt alle möglichen Unicode-Zeichen. Ihre Forschung scheint Sie zu einer falschen Schlussfolgerung geführt zu haben. Sie sollten genau sagen, mit Code, was Sie tun, was Sie erwarten und was stattdessen passiert. –

+0

utf8 und utf16 decken im Prinzip die gleichen Zeichen ab (einschließlich Ihrer akzentuierten Symbole), nur die Codierung ist anders, utf8 bedeutet nicht "8 bit", sondern "minimim von 8 bit"; utf8mb4 in mysql fügt das vierte Byte des utf8-Standards hinzu. Sie sollten es für die Kompatibilität verwenden (es werden weniger Bytes verwendet, wenn Sie nicht alle benötigen). Die '_unicode_ci' oder '_general_ci' betrachten nur die Sortierung (Sie sollten' _unicode_ci' verwenden). Sie haben wahrscheinlich irgendwo in Ihrer Kette ein Codierproblem (Zeichenfolgen in Java sind utf16, Sie müssen möglicherweise die korrekte utf8-Codierung in Ihrem Treiber/Import/Bytestream/Ausgabe-Client einstellen). – Solarflare

Antwort

4

Man sollteCHARACTER SET utf8 oder utf8mb4 für die Codierung verwenden. utf8 umfasst ganz Europa und meisten des Rests der Welt. utf8mb4 deckt alle Sprachen der Welt ab. utf8 ist eine Teilmenge von utf8mb4.

Sie können verschiedene COLLATIONs je nach Bestellung Sie wünschen. Spanisch zum Beispiel (mit utf8_spanish2_ci oder utf8mb4_spanish2_ci) spielt Spiele mit ll, die andere Sprachen nicht haben. utf8_latvian_ci behandelt Ķ als ein anderes Zeichen als K; andere nicht.

Wenn Sie sich keine Gedanken über detaillierte Sprachunterschiede machen, dann empfehle ich ..._general_ci oder ..._unicode_ci oder ..._unicode_520_ci, wenn Sie die neueste Version von MySQL haben. Diese drei Sortierungen in erster Linie unterscheiden sich wie folgt:

  • Allgemein gilt: Nur ein Zeichen für den Vergleich getestet. Dies erlaubt es nicht, ll als separaten Brief zu behandeln. Dieser ist leicht schneller.
  • Unicode: Dies ist von einem älteren Unicode-Standard abgeleitet. Dies behandelt das "Kombinieren" von Akzenten "richtig".
  • unicode_520: Dies basiert auf einem neueren Standard. Emojis werden als verschieden behandelt.
  • Unicode _...: Möglicherweise kommt in späteren Versionen von MySQL mehr.

Es spielt keine Rolle, was Ihre Anwendung tut, Sie must

  • Sagen MySQL jedoch, was der Kunde kodiert hat: ?useUnicode=yes&characterEncoding=UTF-8
  • Stellen CHARACTER SET utf8 (oder utf8mb4) auf jeder Spalte oder Tabelle .
  • Wenn Sie Webseiten verwenden, setzen Sie charset=UTF-8 im Tag meta.