Problem mit MySQL Verbindungszeichensatz utf-8
Subb
- datenbank
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
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.
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.
Hallo Abraham, dedlfix und hotti,
vielen Dank das Ihr mich auf den richtigen Weg gebracht habt!
Gruß,
Subb
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
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!