utf8_bin oder utf8_unicode_ci

maceis

Aktives Mitglied
Thread Starter
Dabei seit
24.09.2003
Beiträge
16.880
Reaktionspunkte
626
Hallo zusammen,

ich migriere gerade einen Server, der einige ältere Datenbanken enthält.
Dabei möchte ich natürlich alte Fehler bzw. Altlasten ausmerzen und in diesem Zuge alle Tabellen auf utf8 umstellen.

Nun bin ich mir nicht ganz sicher, ob ich utf8_bin oder utf8_unicode_ci nehmen soll. Ich tendiere eigentlich zu utf8_bin.

Kann mir jemand sagen, was genau die Unterschiede zwischen den beiden sind, abgesehen davon, dass utf8_unicode_ci nicht case sensitive ist?

Kann man davon ausgehen, dass (bestehende) SELECT Abfragen nach einem Wechseln von latin1_swedisch_ci bzw. von utf8_unicode_ci zu utf8_bin das selbe Ergebnis liefern?

An welchen Stellen kann es sonst noch Probleme geben?

Danke im Voraus und Gruß
maceis
 
Zuletzt bearbeitet:
http://dev.mysql.com/doc/refman/5.1/de/charset-unicode-sets.html

Die bedeutsamste Funktion in utf8_unicode_ci besteht darin, dass Erweiterungen unterstützt werden, d. h., wenn ein Zeichen mit einer Kombination anderer Zeichen gleichgesetzt wird. Beispielsweise wird im Deutschen und einigen anderen Sprachen ‘ß’ mit ‘ss’ gleichgesetzt.

utf8_general_ci ist eine ältere Sortierfolge, die Erweiterungen nicht unterstützt. Hier können nur 1 : 1-Vergleiche zwischen Zeichen durchgeführt werden: Vergleiche für die utf8_general_ci-Sortierfolge sind also schneller, aber unter Umständen weniger korrekt als Vergleiche für utf8_unicode_ci.
 
Danke, das hatte ich schon gelesen.
Nur leider wird hier z.B. nicht erläutert, ob utf8_bin diese Eigenschaften auch hat…
 
Ich kann Deine Fragen leider nicht beantworten, weil ich
a) bisher immer einfach, ohen groß drüber nachzudenken, utf8_general_ci genommen und keine Probleme damit hatte; und
b) noch keine DB von latin1_swedisch_ci auf UTF umgestellt habe: Neue lege ich mit utf8_general_ci an, die alten laufen weiter mit Latin1.

Aber einen Tipp habe ich trotzdem:
Setze, am besten direkt nach dem DB-Connect, folgenden Query ab:
Code:
mysql_query("SET NAMES 'utf8'");

Diese einzelne Zeile hat mir schon jeeeede Menge Ärger erspart… nachdem ich sie denn kannte. Vorher sind mir schon fast graue Haare gewachsen, weil Einträge mit »exotischen Sonderzeichen« wie den deutschen Umlauten immer doch irgendwie falsch in der DB gelandet sind.
 
Das ist in meinem Fall nicht notwendig, weil von Haus aus schon alle entsprechende Variablen auf utf8 gesetzt sind.

Dennoch Danke für den Hinweis.

Ich hab aber jetzt noch einen andere Frage in diesem Zusammenhang:
Bei der Arbeit mit mysql im Terminal gibt es noch so ein kleines kosmetisches Problem.
Es werden die Umlaute in den Serverantworten nicht korrekt dargestellt.
Beispiel:
Code:
Datens?tze: 1  Gel?scht: 0  Ausgelassen: 0  Warnungen: 0

Leider weiß ich nicht, wo ich da ansetzen muss.
Terminal ist auf utf8 eingestellt,
LANG=de_DE.UTF-8 und
Code:
mysql> show variables LIKE 'col%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci | 
| collation_database   | utf8_general_ci | 
| collation_server     | utf8_bin        | 
+----------------------+-----------------+
 
Zuletzt bearbeitet:
Das ist in meinem Fall nicht notwendig, weil von Haus aus schon alle entsprechende Variablen auf utf8 gesetzt sind.

Nun, das war bei mir auch der Fall, trotzdem gab’s immer Probleme, bis ich genannten Query eingesetzt habe… aber das kann natürlich abhängig von der genauen Umgebung bzw. ihrer Konfiguration sein.

Bei dem Terminal-Problem weiß ich leider auch keinen Rat.
 
Das wundert mich, denn laut Handbuch:
http://dev.mysql.com/doc/refman/5.1/de/charset-connection.html schrieb:
Code:
Eine SET NAMES 'x'-Anweisung ist äquivalent zu den folgenden drei Anweisungen:

SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

Bei mir:
Code:
show variables LIKE 'cha%';
+--------------------------+--------------------------------------------------------+
| Variable_name            | Value                                                  |
+--------------------------+--------------------------------------------------------+
| character_set_client     | utf8                                                   | 
| character_set_connection | utf8                                                   | 
| character_set_database   | utf8                                                   | 
| character_set_filesystem | binary                                                 | 
| character_set_results    | utf8                                                   | 
| character_set_server     | utf8                                                   | 
| character_set_system     | utf8                                                   | 
| character_sets_dir       | /usr/local/mysql-5.1.28-rc-osx10.5-x86/share/charsets/ | 
+--------------------------+--------------------------------------------------------+

Ich denke nicht, dass da ein "SET NAMES ..." irgendeine Auswirkung hätte.

Gruß
maceis
 
Zurück
Oben Unten