# [MySQL+PHP] UTF-8 Darstellungsproblem

## Finswimmer

Hallo,

ich habe eine Datenbankoberfläche in PHP geschrieben. Diese hat im Header das Encoding auf UTF-8 gestellt.

Die betreffende Tabelle hat utf8_general_ci als Kollation.

Gebe ich nun über die Oberfläche Umlaute ein, werden diese wieder korrekt angezeigt. Aber in der Datenbank sieht es dann so aus: 

Ã¼Ã¶Ã¤

Gebe ich in der Datenbank "üöä" ein, so erhalte ich ��� in der Oberfläche.

Zugegeben, es wird selten vorkommen, dass ich direkt auf PhpMyAdmin exportiere, aber wenn, dann sollten dort die Daten korrekt sein.

# MySQL-Zeichensatz: UTF-8 Unicode (utf8)

#

Zeichensatz / Kollation der MySQL-Verbindung: utf8-unicode-ci

Getestet habe ich das sowohl auf meinem Gentoo-Rechner als auch auf dem Produktiv-System, welches eine Debian-Abart ist.

Kennt jemand das Problem?

Danke

Tobi

----------

## Christian99

Hi, bei mir geht das.

So als erste Ideen: überprüf doch mal, ob dein Browser wirklich das eingestellte charset verwendet. Ist mir schon mal passiert, dass aufgrung eines tippfehlers das nicht verwendet wurde.

man kann auch jeder einzelnen tabelle und jedem einzelnen textfeld eine kollation einstellen. stehen die auch auf UTF?

Christian

----------

## py-ro

Es ist übrigens im Prinzip egal welche Collation für die Tabelle eingegeben ist, wenn der Client und der Server den Charset richtig miteinander aushandeln, MySQL macht es dann implizit korrekt.

Versuche mal Testweise als erste Abfrage an die Datenbank in deinem PHP-Skript folgendes:

```
SET NAMES 'utf-8'
```

oder

```
SET NAMES 'latin1'
```

Frei aus dem Gedächtnis. PHP handelt das manchmal 'seltsam' aus.

Bye 

Py

----------

## Finswimmer

Danke  :Smile: 

Das hat mich auf den richtigen Trichter gebracht.

Von SET NAMES 'utf8' wurde irgendwo abgeraten, aber 

mysql_set_charset('utf8');

funktioniert prächtig 

Vielen Dank

Tobi

----------

## Finswimmer

Leider funktioniert es nur bei neu eingegebenen Daten.

Die alten Daten sehen jetzt so aus:

- fehlende Einstellung auf PersÃ¶nlichkeit

beobachten kÃ¶nnen

erhÃ¶ht Herausforderung

Leider weiß ich nicht, wie ich das mit MySQL und Convert/Cast in UTF-8 bekomme.

Latin1 scheint es nicht zu sein.

Wie kann ich das denn herausfinden?

Danke

Tobi

----------

## b3cks

DB aus MySQL exportieren > mittels (beispielsweise) iconv nach UTF-8 konvertieren > Dump wieder in MySQL importieren

----------

## Finswimmer

iconv -f ISO8859-1 -t UTF-8 old.sql > new.sql

iconv -f CP1252 -t UTF-8 old.sql > new.sql

führen beide leider nicht zum gewünschten Erfolg.

Vorher ist die Datei aber laut file schon UTF-8:

old.sql: UTF-8 Unicode English text, with very long lines

Ich habe die resultierende Datei auch im Firefox geöffnet und die Standard-Encodings durchgetestet.

Weder mit ISO-8859-1/-15, Windows-1252, UTF-8 kann ich die Umlaute richtig angezeigt bekommen.

Die alte DB hatte als Kollation latin1_swedish_ci, und latin1_german_ci.

Danke

Tobi

----------

## musv

Ich denke, du musst konsequent UTF-8 benutzen:

Gentoo: locale UTF-8

PHP: UTF-8

HTML-Header Encoding: UTF-8

MySQL Kollation: UTF-8

In PHP konntest du sowas auch irgendwo angeben beim Zugriff auf MySQL.

http://de3.php.net/manual/de/mysqli.set-charset.php

http://de3.php.net/manual/de/mysqli.character-set-name.php

Zumindest waren bei mir dann diese Probleme weg. Aber wenn schon die Kodierung der SQL-Datei falsch angezeigt wird, ist da schon der Wurm drin. Erzeugt phpmyadmin ebenfalls falsche Umlaute?

----------

## Finswimmer

Hi,

ich habe herausgefunden, dass utf8_decode (php Funktion), die alten Umlaute richtig anzeigt:

alt:

trotz jÃ¼ngerem Alters: --> utf8_decode --> trotz jüngerem Alters:

neu eingegeben:

üöä --> utf8_decode --> ���

Die Funktion macht folgendes:

Diese Funktion dekodiert Daten (data), die in UTF-8 zu sein scheinen, in ISO-8859-1. 

Wie kann ich das nun machen?

----------

## Christian99

hm, ich würde vermuden, dass php irgendwie standartmäßig davon ausgeht, dass strings iso 8859 sind. eventuell kann man das umstellen?

(nicht sehr hilfreich, sorry. was ich eigentlich sagen will: schau mal bei den php-einstellungen, evtl phpinfo(), ob du da was findest, dass so in der richtung aussieht.)

----------

## musv

utf8_decode() und utf8_encode() sind Workarounds für inkonsistente Kodierungen, d.h. irgendwas in utf8, was anderes in iso. 

Die einzige wirklich brauchbare Lösung ist der konsequente Einsatz von UTF8 auf allen Etappen. Ansonsten bekommst du da nie Ruhe rein.

----------

## Finswimmer

Hi musv,

das Problem ist, dass ich es im Moment inkonsistent habe.

Stelle ich auf UTF8 komplett um, sind die Umlaute der 50.00 Einträge komplett falsch.

Das muss ich dann irgendwie hinbekommen.

Tobi

----------

## musv

 *Finswimmer wrote:*   

> iconv -f ISO8859-1 -t UTF-8 old.sql > new.sql
> 
> iconv -f CP1252 -t UTF-8 old.sql > new.sql
> 
> Vorher ist die Datei aber laut file schon UTF-8:
> ...

 

Klingt jetzt doof, aber probier mal die andere Richtung:

```
iconv -f UTF-8  -t ISO8859-1 old.sql  > new.sql
```

Und lad dann mal die Datei mit Kate oder Scite und spiel etwas mit den Kodierungen rum.

----------

## LinuxTom

Du musst Dein System wieder auf den "alten" Zeichensatz umstellen (da reicht es oft eine laufende Shell umzustellen und von dieser aus MySQL zu starten), den Du _vor_ UTF-8 hattest. Dann alle Daten exportieren, dann MySQL (mit mysql_set_charset('utf8'); ) und auch Dein System wieder auf UTF-8 umstellen und dann das iconv auf dem Datenexport ausführen und wieder importieren. Theoretisch dann fertig. Alles Andere ist ein Mischmasch, das Deine Daten durcheinander wirft und zerhackstückelt.

----------

## Finswimmer

Ich habe an der Datenbank und dem System nichts geändert, sondern nur mysql_set_charset('utf8'); hinzugefügt.

Da ich die ganze Zeit die Daten mit utf8_decode eingegeben habe, sind sie in der Datenbank nun nicht richtig.

@LinuxTom:

Ich teste es nachher mal, aber da man mit "mysql_set_charset('utf8');" nur bei meiner Oberfläche den Zeichensatz umstellt, sehe ich schwarz, dass sich das auswirkt auf einen reinen MySQL Export direkt aus der Konsole.

Gibt es irgendwo eine Möglichkeit herauszufinden, was für ein Zeichensatz sowas ist "trotz jÃ¼ngerem Alters"?

Danke

Tobi

----------

## LinuxTom

 *Finswimmer wrote:*   

> ... sehe ich schwarz ...

 

Versuche es einfach mal, als ob Du die Zeichensätze nie umgestellt hättest. Nach dem Export zwingst Du dann MySQL auf UTF-8. das musste ich auch machen. Danach gab es keine Probleme mehr.

----------

## Finswimmer

Nö.

Ich bekomme es einfach nicht hin.

Ab und zu habe ich es soweit, dass Firefox es sogar cp1252 richtig anzeigt.

Aber das kann es ja auch nicht sein.

----------

## Josef.95

Schau mal ob dir dies eventuell weiterhilft?!

Die Umlautproblematik - was, wieso, was tun?

----------

## Finswimmer

Das geht nun:

export mysqldump -u -p quatras db1c_KE > db1c_KE

iconv -f utf8  -t cp1252 db1c_KE > utf8

import über mysql -u -p -Dquatras

alles bei locale=utf8 

dann muss ich noch mysql_set_charset('utf8'); in meine DB-Verbindung von PHP setzen.

Total merkwürdig.

----------

