Ich versuche herauszufinden, welche Sortierung ich für verschiedene Datentypen verwenden soll. 100% des Inhalts, den ich speichern werde, sind vom Benutzer eingereicht.
Nach meinem Verständnis sollte ich UTF-8 General CI (ohne Berücksichtigung der Groß- und Kleinschreibung) anstelle von UTF-8 Binary verwenden. Ich kann jedoch keine klare Unterscheidung zwischen UTF-8 General CI und UTF-8 Unicode CI finden.
- Sollte ich vom Benutzer eingereichte Inhalte in UTF-8 General- oder UTF-8 Unicode CI-Spalten speichern?
- Für welche Art von Daten wäre UTF-8 Binary anwendbar?
utf8
, verwenden Sieutf8mb4
stattdessen für volle UTF-8 - Unterstützung. Hier kommentieren, weil die Antworten auf diese beliebte Frage dies nicht ansprechen. mathiasbynens.be/notes/mysql-utf8mb4Antworten:
Im Allgemeinen ist utf8_general_ci schneller als utf8_unicode_ci , aber weniger korrekt.
Hier ist der Unterschied:
Zitiert von: http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html
Weitere Informationen finden Sie im folgenden Beitrag in den MySQL-Foren: http://forums.mysql.com/read.php?103,187048,188748
Utf8_bin: Sowohl utf8_general_ci als auch utf8_unicode_ci führen einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung durch. Im Gegensatz dazu unterscheidet utf8_bin (unter anderem) zwischen Groß- und Kleinschreibung , da es die Binärwerte der Zeichen vergleicht.
quelle
show collation;
können Sie die Standardkollatierung für jeden Zeichensatz anzeigen. 5.1 wirdutf8_general_ci
standardmäßig für angezeigtutf8
.Sie sollten sich auch der Tatsache bewusst sein, dass mit utf8_general_ci bei Verwendung eines varchar-Felds als eindeutiger oder primärer Index das Einfügen von 2 Werten wie 'a' und 'á' einen doppelten Schlüsselfehler ergeben würde.
quelle
utf8_unicode_ci
utf8_bin
vergleicht die Bits blind. Kein Fallklappen, kein Akzentabziehen.utf8_general_ci
vergleicht ein Byte mit einem Byte. Es werden Fallfalten und Akzententfernung durchgeführt, aber keine 2-Zeichen-Vergleiche:ij
istij
in dieser Zusammenstellung nicht gleich .utf8_*_ci
ist eine Reihe von sprachspezifischen Regeln, aber ansonsten wieunicode_ci
. Einige Sonderfälle:Ç
,Č
,ch
,ll
utf8_unicode_ci
folgt einem alten Unicode-Standard für Vergleiche.ij
=ij
, aberae
! =æ
utf8_unicode_520_ci
folgt einem neueren Unicode-Standard.ae
=æ
In der Kollatierungstabelle finden Sie Details dazu, was in verschiedenen utf8-Kollatierungen gleich ist.
utf8
, wie von MySQL definiert, ist auf die 1- bis 3-Byte-utf8-Codes beschränkt. Dies lässt Emoji und einige Chinesen aus. Sie sollten also wirklich zu wechseln,utf8mb4
wenn Sie weit über Europa hinausgehen möchten.Die obigen Punkte gelten
utf8mb4
nach geeigneter Rechtschreibänderung. Vorwärts gehenutf8mb4
undutf8mb4_unicode_520_ci
werden bevorzugt.quelle
Wirklich, ich habe das Speichern von Werten wie 'é' und 'e' in einer Spalte mit eindeutigem Index getestet und sie verursachen doppelte Fehler sowohl bei 'utf8_unicode_ci' als auch bei 'utf8_general_ci'. Sie können sie nur in der sortierten Spalte 'utf8_bin' speichern.
Und MySQL-Dokumente (in http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html ) schlagen in ihren Beispielen die Sortierung 'utf8_general_ci' vor.
quelle
Akzeptierte Antwort ist veraltet.
Wenn Sie MySQL 5.5.3+ verwenden, verwenden Sie
utf8mb4_unicode_ci
stattdessen,utf8_unicode_ci
um sicherzustellen, dass die von Ihren Benutzern eingegebenen Zeichen keine Fehler verursachen.utf8mb4
unterstützt beispielsweise Emojis, während Sieutf8
möglicherweise Hunderte von Fehlern im Zusammenhang mit der Codierung erhalten, wie z.Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1
quelle
utf8mb4_unicode_ci
behandelt (glaube ich) alle Emoji als gleich.utf8mb4_unicode_520_ci
gibt Emoji einen Befehl.