List:German« Previous MessageNext Message »
From:f4ckm5 Date:March 28 2009 4:50pm
Subject:Re: Deutsche Umlaute und UTF8
View as plain text  
# ----------------
# Problem:
# ----------------

Wenn man die MySQL Konsole über die Eingabeaufforderung (cmd.exe) von 
Windows aufruft und deutsche Umlaute per INSERT oder UPDATE in Tabellen 
einfügt, so werden diese bei Abruf über die MySQL Konsole zwar korrekt 
ausgegeben , aber beim Zugriff mit anderen Datenbank-Clients (z.B. 
Ausgabe per PHP in eine Webseite) erscheinen statt der Umlaut andere 
Sonderzeichen statt einem "Ü" z.B. "š".

# ----------------
# Ursache:
# ----------------

Die Standardeinstellung für den Zeichensatz auf der Clientseite (MySQL 
Konsole) und auf der Serverseite ist unter Windows bei einer 
Standardinstallation des MySQL Servers "latin1". Die aktuellen werte 
einer Clientverbindung lassen sich mit "show variables like 'char%';" 
abfragen. Das Ergebnis ähnelt i.d.R. diesem:

mysql> show variables like 'char%';
+--------------------------+-----------------------------------------------------+
| Variable_name            | Value 
          |
+--------------------------+-----------------------------------------------------+
| character_set_client     | latin1 
          |
| character_set_connection | latin1 
          |
| character_set_database   | latin1 
          |
| character_set_filesystem | binary 
          |
| character_set_results    | latin1 
          |
| character_set_server     | latin1 
          |
| character_set_system     | utf8 
          |
| character_sets_dir       | C:\Programme\MySQL\MySQL Server 
5.1\share\charsets\ |
+--------------------------+-----------------------------------------------------+
8 rows in set (0.00 sec)

Der MySQL Zeichensatz "latin1" entspricht im Grobem dem Zeichensatz 
Windows-1252 bzw. ISO/IEC 8859-1.
Windows verwendet aber für die Eingabeaufforderung (cmd.exe) 
standardmäßig nicht die Codepage Windows-1252, sondern MS-DOS 850. 
Drücke ich mit CodePage 850 das "Ü", so wird dieses vom Zahlenwert her 
als (dec)154 interpretiert und auf der Konsole auch als "Ü" angezeigt. 
MySQL speichert dieses "Ü" dann als ein Byte mit dem Wert (dec)154 in 
der Datenbank. Übersetzt nach Windows-1252 bzw. latin1 bedeutet (dec)154 
aber "š". Wenn ich umgekehrt z.B. von einem PHP Formular aus ein "ü" 
eingebe, so wird dies als (dec)252 in der Datenbank gespeichert, 
bedeutet aber in der Zeichentabelle MS-DOS 850 "³". D.h. die Umlaute, 
die ich über einen Client eingebe, sind bei Abruf über den selben Weg 
immer korrekt, aber bei Abruf über den anderen immer falsch.

# ----------------
# Lösung:
# ----------------

Über den Befehl "chcp" (kurz für Change Codepage) kann man die Codepage 
für die Kommandozeile ändern. Ein einfaches "chcp 1252" schaltet die 
cmd.exe auf Windows-1252 bzw. latin1 um. Tippe ich jetzt ein "ü" 
erscheint bei Verwendung der Rasterschrift für das Konsolenfenster ein 
"³". Man kann die Schriftart für das Konsolenfenster aber auf "Lucida 
Console" umstellen, die auch Windows-1252 beherrscht, und erhält dann 
wieder ein "ü" angezeigt. Rufe ich danach die MySQL Konsole auf, werden 
die eingegebenen Umlaute von der Eingabeaufforderung als die Zahlenwerte 
an MySQL weitergereicht, die im Rahmen der Clienteinstellung latin1 
erwartet werden.
Man kann sich auch eine Verknüpfung bauen, die die Codepage vor dem 
Aufruf der MySQL Konsole automatisch umschaltet. Deren Ziel sähe dann in 
etwa so aus:

C:\WINDOWS\system32\cmd.exe /c chcp 1252 && "C:\Programme\MySQL\MySQL 
Server 5.1\bin\mysql.exe" -uuser -ppasswort

Mit freundlichen Grüßen

Jürgen Schmitts
Thread
Re: Deutsche Umlaute und UTF8f4ckm528 Mar
  • Re: Deutsche Umlaute und UTF8Susanne Ebrecht30 Mar
    • Re: Deutsche Umlaute und UTF8f4ckm530 Mar
      • Re: Deutsche Umlaute und UTF8Susanne Ebrecht31 Mar
        • Re: Deutsche Umlaute und UTF8f4ckm51 Apr