MySQL charset - von latin nach utf-8
Siehe auch:
Überblick - einheitlich utf-8 nutzen[Bearbeiten]
Wenn man seinen PHP Code oder seine HTML-Ausgabe auf utf-8 umstellt kann es zu Problemen kommen. Weil hier mehrere Komponenten zusammenspielen (Datenbank, Datenbank-Verbindung und Code bzw. Interpretation durch den Browser) ist die Lösungsfindung manchmal schwierig. Die sauberste und zeitgemäße Lösung ist, dass alle Komponenten (Datenbank, Verbindung zur Datenbank und php-Code/HTML-Seite) einheitlich mit utf-8 arbeiten.
Symptome[Bearbeiten]
Die Ansicht in phpMyAdmin zeigt statt Umlauten oder Sonderzeichen seltsame doppelte Zeichen. Das Problem rührt daher, daß mySQL früher keine utf-8 Zeichen speichern konnte. Daher wurden zweibyteige Zeichen quasi als zwei Characters gespeichert. Da wir aber jetzt auch in der Datenbank mit utf-8 Arbeiten wollen (spätestens ab mySQL 5) möchten wir die Zeichen konvertieren.
Lösungsansatz[Bearbeiten]
Ein Trick ist zuerst das Feld über MODIFY in einen Binären Datentyp umzwandeln und dann mit dem richtigen Zeichensatz zurück zu wandeln. Dabei werden quasi die vorher als zwei Zeichen dargestellten Zeichen als korrekte utf-8 Zeichen konvertiert.
Achtung: Beim zurückwandeln in einen Texttyp darauf achten, dass man hier den richtigen Typ nimmt (varchar oder text oder char) sonst werden evtl. Zeichen abgeschnitten.
alter database... ist nur notwendig wenn die db noch nicht auf utf-8 steht
alter table TABLE_NAME modify FIELD_NAME blob; alter database DATABASE_NAME charset=utf8; alter table TABLE_NAME modify FIELD_NAME varchar(255) character set utf8;
Wenn das Feld schon utf-8 ist aber die Daten noch in latin muß man zuerst zurück nach latin
alter table TABLE_NAME modify FIELD_NAME varchar(255) character set latin1; alter table TABLE_NAME modify FIELD_NAME blob; alter table TABLE_NAME modify FIELD_NAME varchar(255) character set utf8;
Werden Datensätze ab einem Sonderzeichen abgeschnitten kann das daran liegen, daß die Zeichen schon umgewandelt waren aber die Tabelle noch nicht mit utf-8 arbeitet. Dann muß man nur das Feld umwandeln.
alter table TABLE_NAME charset utf8; alter table TABLE_NAME modify FIELD_NAME varchar(255) character set utf8;