UTF-8 mit MySQL, PHP und Hibernate richtig verwenden
UTF-8 mit MySQL korrekt zu verwenden ist für einen Anfänger nicht ganz trivial. Ich wurde letzte Woche von einem befreundeten Softwareentwickler, der aktuell dabei ist, seine gesamten Webprojekte nach UTF-8 zu migrieren, um Rat hinsichtlich der MySQL-Datenbanken gefragt. Da ich mich vor einigen Jahren damit selbst auch rumgeärgert habe und es wohl kein ganz triviales Problem ist, möchte ich mein Erfahrungen mit diesem Beitrag gerne weiterreichen.
Folgendes Problem bestand:
Die Kollation der einzelnen Datenbanktabellen wurden von "latin1_swedish_ci" etc. auf "utf8_general_ci" umgestellt. Es greifen Anwendungen unterschiedlicher Systeme und Programmiersprachen auf die Datenbank zu. Einige Anwendungen kamen ohne Probleme mit der neuen Kollation zurecht, andere jedoch nicht. Das Ergebnis war trotz der Umstellung ein Gemisch aus aus UTF-8 und ISO/IEC 8859.
Die Lösung:
Ein einfaches Umstellen der Kollation auf UTF-8 reicht nicht aus. Verwendet man Bibliotheken für den Zugriff auf die mySQL-Datenbank muss diesen in oftmals explizit mitgeteilt werden, dass UTF-8 verwendet werden soll. Dies ist zum Beispiel unter PHP der Fall. Es muss nach Aufnahme der Verbindung über die Methode
mysql_set_charset('utf8');
der Zeichensatz eingestellt werden. Unter Java legt Hibernate afaik neue Tabellen je nach Standardkollation der Datenbank an. Die Verbindung kann durch die Verbindungs-URL "jdbc:mysql://localhost/meineDatenbank? useUnicode=true& connectionCollation=utf8_general_ci&characterSetResults=utf8" auf UTF-8 umgestellt werden (Leerzeichen in URL weglassen).
Zur Vervollständigung noch der Hinweis: Damit der Anwender auch UTF-8 sieht, muss die Kodierungsangabe im HTML auf UTF-8 gestellt werden => z. B. über das Meta-Tag: <meta http-equiv="content-type" content="text/html; charset=utf-8">.
Nochmal zusammengefasst, was man beachten muss wenn man ausschließlich UTF-8 verwenden möchte:
1) Datebank auf UTF-8 umstellen
2) Bibliotheken etc. mitteilen, dass MySQL mit UTF-8 verwendet werden soll
3) HTML-Seiten als UTF-8 abspeichern und dies auch so im HTML-Dokument selbst so vermerken.
