# ----------------
# 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