dedlfix: Umlaute in MYSQL-Datenbank

Beitrag lesen

Hi!

ich habe ein Problem mit dem Schreiben von Umlauten in eine MYSQL-Datenbank: In einem Webformular gebe ich z.B. ein "ä" ein. Dieses wird in der MYSQL-Datenbank als "ä" gespeichert.

MySQL-Datenbanken sind ein Blackboxen. Wie etwas gespeichert ist, siehst du nicht. Selbst wenn du dir die Dateien mit einem Heyeditor ansiehst, weißt du noch lange nicht, wie die Daten nach einer Abfrage aussehen, weil sie dazu gegebenenfalls umkodiert werden.

Wenn ich vor Ausführen der INSERT-Anweisung den ins Formular eingegebenen Buchstaben mit utf8_decode konvertiere, wird korrekt als "ä" gespeichert.

Das bedeutet, dass MySQL annimmt, du sendest Latin1-Daten.

Eine solche Konvertierung sollte aber gar nicht nötig sein, denn sowohl Formularseitig als auch Datenbankseitig scheint alles auf "utf8" eingestellt (siehe unten).

Ja, wenn man es richtig macht.

Hat jemand eine Idee, warum hier trotzdem eine Konvertierung notwendig ist, bzw. wie ich diese unschöne Konvertierung vermeiden kann?

Richtig machen.

Gibt es möglicherweise serverseitige Einstellungen, die meine Angaben übersteuert haben?

Nein, ich vermute eher, dass du irgendwo einen Verbindungsaufbau übersehen hast und in den Fällen gar keine Angaben von dir dem MySQL-Server bekannt sind.

Die absendende Website hat folgende Angabe im Kopfbereich:
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

Das ist eine mittelbare Angabe. Sie kann vom Webserver im HTTP-Header überschrieben werden. Prüfe lieber, wie die Daten wirklich aussehen, bevor du sie MySQL übergibst. bin2hex() geht dafür, url_enconde() lässt sich auch dafür missbrauchen (und ist leichter zu lesen als bin2hex()).

Das Formular zum Erfassen der Daten hat folgende Angaben:
<form id="erfassungsformular" name="erfassungsformular" action="erfassung.htm" accept-charset="UTF-8" method="post">

accept-charset wird nicht von allen Browsern korrekt beachtet. Wichtiger ist deshalb, HTTP-Header und Meta-Angabe korrekt zu setzen.

Die Verbindung zur MYSQL-Datenbank wird wie folgt hergestellt:
$verbindung = mysqli_connect(host, user, passwd, db) or die;
mysqli_query("SET NAMES 'utf8'",$verbindung) OR print(mysqli_error());
mysqli_query("SET CHARACTER SET 'utf8'",$verbindung) OR print(mysqli_error());

SET NAMES und SET CHARACTER SET überschreiben sich gegenseitig. Beide zu setzen ist unsinnig und zudem ist SET CHARACTER SET mit Vorsicht zu genießen. Lass beides weg und nimm lieber stattdessen mysqli_set_charset().

Das Auslesen der Variablen in der Datenbank mit
SHOW VARIABLES LIKE "c%"

Das muss natürlich auch in der Verbindung erfolgen, die du untersuchen willst. Beispielsweise mit dem phpMyAdmin zu schauen, bringt dir für deine Verbindung gar nichts.

Grundlegender Literaturtipp: SELFHTML-Wiki Themen:Zeichencodierung, besonders der MySQL-Abschnitt (und der zum Webserver).

Lo!