Nun ist es so, dass bei der Ausgabe von Datenbankergebnissen Zeichen wie ä ö ü etc. nicht richtig dargestellt werden!
$charset = mysql_client_encoding($db_blablabla);
printf("MySQL Verbindungszeichensatz ist: %s\n<br />", $charset);Das Ausgabeergebnis ist: latin1
Nun meine frage, habe ich irgendetwas vergessen das die Datenbank mit utf-8 kommuniziert?
Ja, du hast die Verbindung nicht auf utf-8 eingestellt.
Mit mysql_query("SET NAMES 'utf8'", $db_blablabla); könnte ich ja das Problem umgehen aber warum sollte ich solch einen Umweg benutzen?
Weil das kein Umweg ist, sondern der normale Weg.
- Wie deine Anwendung die Daten ausgibt (lies: wie deine HTML-Seiten kodiert sind), interessiert die Datenbanksoftware nicht.
- Wie in den Tabellen die Daten gespeichert werden, besagt nur genau dieses: Wie sie gespeichert werden, d.h. welchen Umfang an Zeichen du speichern kannst und wie die Zeichen sortiert werden. In einer latin1-Spalte kannst du beispiels- und logischerweise keine arabischen Zeichen speichern.
- Wie die Daten an deine Anwendung geliefert werden, der Verbindungszeichensatz, ist eine von den beiden anderen Punkten vollkommen unabhängige Geschichte. Du kannst Buchstaben in einer Unicode-Tabelle haben und diese, soweit möglich, in einem Latin-1-Programm ausgeben. Du kannst auch umgekehrt eine Latin-1-Tabelle haben und trotzdem alle Zeichen ohne weitere Umwandlung unfallfrei in eine utf-8-Anwendung ausgeben – du musst MySQL lediglich mitteilen, in welcher Kodierung du die Daten geliefert haben möchtest.
Grundsätzlich hast du einen Denkfehler: Ein Buchstabe ist ein Buchstabe und kein Byte. PHP und viele andere Sprachen machen historisch bedingt denselben Fehler, sie behandeln Buchstaben stur als ein Byte und kommen ins Schleudern, sobald Kodierungen ins Spiel kommen, die Buchstaben mehrere Bytes oder andere Bytewerte zuweisen.
MySQL macht diesen Fehler hingegen (größtenteils) nicht, MySQL behandelt Buchstaben als solche und lässt dir die Möglichkeit, die Darstellung der Buchstaben zu wählen. Und genau das hast du vergessen, korrekt einzustellen.
Ab PHP 5 ist es übrigens empfehlenswert, die Funktion mysql_set_charset() zu benutzen, nicht SET NAMES.