dedlfix: utf8_unicode_ci oder utf8_general_ci

Beitrag lesen

echo $begrüßung;

Wie ist das vor mysql_set_charset() gelaufen? Die Daten kamen vom Benutzer bzw. Browser als UTF-8. In die DB wurden sie als Latin1 geschrieben, weswegen sie vom PMA zerschossen wurden, das ist mir soweit klar. Von MySQL kamen sie als Latin1 zurück an den PHP-Interpreter. Doch was ist jetzt passiert?

PHP hat UTF-8-kodierte Daten (vermutlich von Browser erhalten, und das auch noch korrekt kodiert) gesendet. Jedoch hat MySQL unter der Annahme, es kämen Latin1-Daten die Bytesequenz eines UTF-8-Zeichens oberhalb von 0x7F als einzelne Zeichen betrachtet. Wenn die Feldkodierung auf UTF-8 eingestellt war, hat MySQL nun diese beiden vermeintlichen Latin1-Zeichen einzeln nach UTF-8 umkodiert und abgelegt. Ein LENGTH() sollte 4 Bytes zeigen, ein CHAR_LENGTH() hingegen 2 Zeichen, zuzüglich der Zeichen unterhalb von 0x7F.

Der PMA forderte auf seiner Verbindung UTF-8-kodierte Daten an. Beim Auslesen war also keine Umkodierung erforderlich. Deine Applikation hat nichts gesagt und damit galt Latin1. MySQL hat nun die UTF-8-kodierten Daten zurück nach Latin1 gewandelt. Bei den ehemals fehlerhaft eingelesenene Daten wurden aus den 4 UTF-8-Bytes wieder die zwei Latin1-Bytes, die du als UTF-8 interpretiert hast. Die ordentlich kodierten per PMA eingegebenen Zeichen wurden ebenfalls nach Latin1 umkodiert, wenn das betreffende Zeichen überhaupt in Latin1 verfügbar war. Ein einzelnes Latin1-Zeichen oberhalb von 0x7F ist aber keine gültige UTF-8-Bytesequenz, was dann zu dem auf der Spitze stehenden Fragezeichenquadrat führt. Ein testweises Umschalten des Browsers über das Menü Ansicht (Zeichen-)Kodierung nach ISO-8859-1 bzw. Win-1252 sollte dir diese Zeichen richtig anzeigen.

Wieso hat die Applikation die Latin1-Daten trotz des UTF-8-Metas die Umlaute "richtig" dargestellt? Wurden die falschen "Multibyte"-Latin1-Zeichen, die im Prinzip statt einzelner Umlaute einfach mehrere Zeichen waren, vom Browser durch das UTF-8-Meta als einzelne richtige Multibyte-UTF-8-Zeichen interpretiert, oder wie muß ich mir das vorstellen?

Du bekamst von MySQL die zwei Byte, die du irgendwann mal hingesendet hast, zurückgeliefert, und die du nun wieder als UTF-8 betrachtend einfach durchgereicht hast.

Ohne den PMA hättest du den Fehler gar nicht bemerkt. Erst wenn du Funktionen wie LENGTH() oder CHAR_LENGTH() verwendet hättest, wäre der Fehler zum Vorschein gekommen. Auch Sortierungen dürften auf der Basis falscher Kodierungen nur eher zufällig richtig funktioniert haben.

utf8_unicode_ci oder utf8_general_ci? Oder ist es sinnvoller, wenn ich mir versuche die Frage selbst mit http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html zu beantworten?

Es gibt geringe Unterschiede in der Sortierung. Welche Variante dir lieber ist, musst du selbst klären. Das Handbuch zählt dir die Unterschiede auf.

echo "$verabschiedung $name";