Subb: Problem mit MySQL Verbindungszeichensatz utf-8

Hallo an alle Leser,

bezüglich MySQL Zeichensatzverbindung bräuchte ich dringend eure Anregungen oder Hilfe!

Ich habe bei Strato ein Hostingpaket namens Powerplus mit 5 Datenbanken.
Hiervon habe ich eine MySQL Datenbank auf utf8_general_ci in der Zeichensatz / Kollation der MySQL-Verbindung eingestellt. Die Tabellenspalten sind ebenfalls auf utf8_general_ci eingerichtet. In der Zeilenstatistik wird Format: dynamisch und Kollation: utf8_general_ci ausgegeben.

Meine PHP Seite ist vollständig auf utf-8 eingerichtet:
<?php
header('Content-Type: text/html; charset=utf-8');
?>

und

<head>
<meta http-equiv="content-type" content="application/xhtml xml;charset=utf-8" />

Nun ist es so, dass bei der Ausgabe von Datenbankergebnissen Zeichen wie ä ö ü etc. nicht richtig dargestellt werden!

Ich habe dann mittels eines Codes den Verbindungszeichensatz ausgeben lassen:

$charset = mysql_client_encoding($db_blablabla);
printf("MySQL Verbindungszeichensatz ist: %s\n<br />", $charset);

Das Ausgabeergebnis ist: latin1

Strato meint dass sie zurzeit keinen Fehler feststellen könnten und üben sich mit Geduld!

Nun meine frage, habe ich irgendetwas vergessen das die Datenbank mit utf-8 kommuniziert?

Mit mysql_query("SET NAMES 'utf8'", $db_blablabla); könnte ich ja das Problem umgehen aber warum sollte ich solch einen Umweg benutzen?

Vorab bedanke ich mich für alle antworten!

Gruß,

Subb

  1. 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.

    1. Hallo Abraham, dedlfix und hotti,

      vielen Dank das Ihr mich auf den richtigen Weg gebracht habt!

      Gruß,

      Subb

  2. hi,

    Nun ist es so, dass bei der Ausgabe von Datenbankergebnissen Zeichen wie ä ö ü etc. nicht richtig dargestellt werden!

    Prüf mal, in welcher Codierung die Zeichen in der DB vorliegen, am Besten auf der Kommandozeile oder falls Du da nicht rankommst, lass Dir vom Provider einen Dump schicken.

    Hotti

  3. Hi!

    Hiervon habe ich eine MySQL Datenbank auf utf8_general_ci in der Zeichensatz / Kollation der MySQL-Verbindung eingestellt.

    Du meinst, du hast im phpMyAdmin eingestellt, welche Kodierung er auf seinen Verbindungen zum Server verwenden soll. Nun, das nützt dir auf anderen Verbindungen gar nichts. Für jede Verbindung musst du nach deren Aufbau die zu verwendende Kodierung aushandeln, wenn du nicht irgend einen System-Default-Wert haben willst.

    Nun ist es so, dass bei der Ausgabe von Datenbankergebnissen Zeichen wie ä ö ü etc. nicht richtig dargestellt werden!

    An der Art der Nicht-Richtig-Darstellung kann ein geübtes Auge häufig ablesen, was schief läuft.

    Nun meine frage, habe ich irgendetwas vergessen das die Datenbank mit utf-8 kommuniziert?

    Ja, mysql_set_charset() und SET NAMES - wie schon gesagt - überschreibt den System-Default-Wert, der sonst bei jedem Verbindungsaufbau genommen wird. Übrigens: mysql_set_charset() wäre die richtigere Variante, weil damit auch das Verhalten von mysql_real_escape_string() angepasst wird, aber SET NAMES ist für alle ISO-8859-Kodierungen und UTF-8 ausreichend (nicht jedoch für einige asiatische Kodierungen).

    Lo!