[MySQL] Einfügen von UTF8 Texten

[MySQL] Einfügen von UTF8 Texten

am 23.07.2007 15:58:44 von Andreas Pankratz

Hallo Newsgroup,

ich habe mit mysqldump zu kämpfen, das mir die Umlaute der deutschen
Sprache nicht richtig abspeichert. (Umgeleitet in Datei, geöffnet in
einem UTF8 fähigen Editor) Wie ich bemerkt habe hat jedoch das MySQL
GUI Administrator auch seine Probleme damit.

Die Daten werden über PHP eingefügt und ausgelesen, im Browser werden
die Umlaute korrekt angezeigt. Spiel ich jedoch ein Backup ein, so
werden die Umlaute eben nicht mehr angezeigt.

Hier einige Infos + Testtabelle:

# file -i index.php
index.php: text/x-c++; charset=3Dutf-8

<--omitted-->

<--omitted-->

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.0.22 |
+-----------+
1 row in set (0.00 sec)


mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> show create table fu\G
*************************** 1. row ***************************
Table: fu
Create Table: CREATE TABLE `fu` (
`id` int(10) unsigned NOT NULL auto_increment,
`text` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=3DInnoDB DEFAULT CHARSET=3Dutf8
1 row in set (0.00 sec)

mysql> select * from fu;
+----+--------+
| id | text |
+----+--------+
| 1 | äöbc |
+----+--------+
1 row in set (0.00 sec)

Was mich eben stutzig macht, dass der MySQL Administrator die Zeichen
auch nicht lesen kann, die Umlaute die jedoch über den Administrator
eingefügt werden passen auch im Backup. Deshalb ist meine Vermutung,
dass die Umlaute bereits falsch an die Datenbank gesendet werden,
warum werden Sie aber, solang kein externes Programm eingreift wieder
richtig dargestellt?

Brauch ich jetzt utf8_encode() und utf8_decode()? Is ja normalerweise
ein Schmarrn, wenn die Daten in UTF8 kommen und schließlich auch in
UTF8 angezeigt werden. Ist die Frage: Wenn die endgültige HTML in UTF8
codiert ist, wird dann das Forumlar auch in UTF8 gesendet und wie
verarbeitet das PHP?

Gruß
Andreas Pankratz

Re: [MySQL] Einfügen von UTF8 Texten

am 25.07.2007 23:53:05 von Hadanite Marasek

> Was mich eben stutzig macht, dass der MySQL Administrator die Zeichen
> auch nicht lesen kann, die Umlaute die jedoch über den Administrator
> eingefügt werden passen auch im Backup. Deshalb ist meine Vermutung,
> dass die Umlaute bereits falsch an die Datenbank gesendet werden,
> warum werden Sie aber, solang kein externes Programm eingreift wieder
> richtig dargestellt?
>
> Brauch ich jetzt utf8_encode() und utf8_decode()? Is ja normalerweise
> ein Schmarrn, wenn die Daten in UTF8 kommen und schließlich auch in
> UTF8 angezeigt werden. Ist die Frage: Wenn die endgültige HTML in UTF8
> codiert ist, wird dann das Forumlar auch in UTF8 gesendet und wie
> verarbeitet das PHP?

Ich habe zum Thema mal einen Artikel geschrieben:
http://www.hadanite-marasek.de/Leben%20und%20lieben%20mit%20 UTF8.htm

Das Problem ist, dass MySQL noch ein Connection Encoding hat, dass bei
Dir vermutlich noch auf Latin1 steht. Er interpretiert dann die Bytes
eines UTF-8-Zeichens als einzelne Latin1-Zeichen, wandelt diese in UTF8
um und speichert das so in der Datenbank! Umgekehrt wird es rückgängig
gemacht.

Im Kontext des MySQL-QueryBrowsers & Administrators fällt der Fehler
dann auf.

Folgende zwei Queries setzen das Connection Encoding:
$pdo->query("set character set utf8");
$pdo->query("set names utf8");

Die Reihenfolge ist übrigens /auch/ relevant, ich hoffe, ich habe es
richtig (fällt auf bei z. B. Wrocław).

Gruss Claus
--
Mein Zeugs:
http://www.hadanite-marasek.de/classes.php
http://www.objektivsuche.de/

Re: [MySQL] Einfügen von UTF8 Texten

am 26.07.2007 01:51:10 von Michael Fesser

..oO(Hadanite Marasek)

>Folgende zwei Queries setzen das Connection Encoding:
>$pdo->query("set character set utf8");
>$pdo->query("set names utf8");
>
>Die Reihenfolge ist übrigens /auch/ relevant, ich hoffe, ich habe es
>richtig (fällt auf bei z. B. Wroc?aw).

SET NAMES 'utf8'

sollte genügen.

Micha