Re: Verständnisfrage zu Zeichensätzen bei Mysql
- From: Axel Schwenke <axel.schwenke@xxxxxx>
- Date: Fri, 3 Aug 2007 13:04:04 +0200
Daniel Maus <maus@xxxxxxxxxxxxxxxxxxxxx> wrote:
ich bin gerade etwas verwirrt ob der Zeichensatzmöglichkeiten bei Mysql.
Aber vielleicht erst mal die Zustandsbeschreibung:
Gegeben sind:
A: ein Produktivsystem mit Mysql V4.0 auf einem älteren Mandrake, daß
mit UTF-8 Daten eines Apachen gefüttert wird und das die UTF-8 Daten
auch wieder für UTF-8 Webseiten rausrückt. ;-)
Tja, schon kaputt. MySQL 4.0 kann kein utf8. Vermutlich enthalten
die Tabellen also utf8 Daten obwohl sie als latin1 deklariert sind.
MySQL4.0 stört das nicht, weil es Daten prinzipiell *immer* so
rausrückt, wie es sie bekommen hat. Auch String-Literale, bspw. für
.... WHERE foo='bär' ...
werden 1:1 mit dem Tabelleninhalt verglichen.
B: Ein Etch (stable) im Aufbau mit passenden deb Mysql V5.0 (müßte das
sein).
Ziel ist die Ablösung von A durch B.
Seit 4.1 beachtet MySQL für jedes String-Objekt die "Encoding"
Eigenschaft und kennt i.d.R. auch noch verschiedene Collations pro
Encoding. Wenn also deine Daten in der Tabelle als latin1 deklariert
sind, dein Client aber sagt, "vergleiche mal mit _utf8'bär'" dann
konvertiert MySQL das ganze Gedöns, bis es vergleichbar ist und
findet den Bären in den Daten nicht (weil der als "b\xC3\xA4r"
in der Tabelle steht und nicht als "b\xE4r").
Die Webanwendung läuft auch auf B einwandfrei. Umlaute werden korrekt
wiedergegeben. Auch wenn ich direkt mit dem Mysqlclient die Tabelle
abfrage, paßt das.
Aber warum?
Weil sowohl die Daten als latin1 deklariert sind als auch der Client
behauptet, latin1 zu sprechen. Unter der Haube versteht der Client
aber offensichtlich doch utf8 und zeigt es dann richtig an.
Du kannst ja spaßeshalber mal ein non-utf8 xterm starten und darin
den Kommandozeilenclient. Dann wirst du sehen.
Stelle ich den Client auf UTF-8 um, dann werden die Umlaute
versägt, respektive ich bekomme die 2-ByteKodierung als 2 Zeichen
angezeigt. Aber wenn ich das richtig gelesen habe, bedeutet doch
"Charakter-set-results" bei mir, daß das Ergebnis nach latin1
umgewandelt wird, bevor es an den Client geschickt wird.
Jep. Und da es laut Deklaration ja bereits latin1 ist, wird gar nix
konvertiert und es geht doch. Zweimal falsch gibt wieder richtig.
Oder anders gesagt: 5.0 verhält sich hier genauso transparent wie 4.0
weil Transport-Encoding und Storage-Encoding gleich sind.
So, viel geschrieben. Vielleicht kann mir einer auf die Sprünge helfen,
die Doku konnte es bislang nicht.
Die Lösung ist einfach: bring die Deklaration deiner Daten in
Übereinstimmung mit dem Inhalt. Da anscheinend eine Menge Leute utf8
in MySQL4.0 gespeichert haben, erklärt das auch das Handbuch:
http://dev.mysql.com/doc/refman/4.1/en/charset-upgrading.html
Hauptfrage wäre für mich, was für einen Sinn es machen würde MYSQL
durchweg auf UTF-8 umzustellen.
Keinen. Insbesondere weil da das Wort "durchweg" steht. Wenn du sagst
"eine bestimmte Tabelle" oder "alle Tabellen in einer bestimmten
Datenbank" - dann sieht das schon anders aus.
Das hat übrigens keinen technischen Hintergrund, sondern einen mensch-
lichen. Wenn alle DBAs perfekt wären, würden sie vor jedem CREATE TABLE
genau nachdenken, welches Encoding (und welche Collation) sie denn für
welche Spalte brauchen und würden das auch explizit hinschreiben. Dann
wäre es egal, was als Default eingestellt ist.
Wobei sich dann die Frage stellt, ob die Replikation sauber weiterlaufen
würde und ich nicht nachher einen Mischmasch bei den Zeichenkodierungen
hätte.
Da wird es haken. Weil dein 4.0 Master ja behauptet, er würde latin1
anliefern (aber in Wirklichkeit utf8). Der Slave wird also das
vermeintliche latin1 in utf8 umwandeln und damit kaputt machen.
XL
.
- Follow-Ups:
- Re: Verständnisfrage zu Zeichensätzen bei Mysql
- From: Daniel Maus
- Re: Verständnisfrage zu Zeichensätzen bei Mysql
- References:
- Verständnisfrage zu Zeichensätzen bei Mysql
- From: Daniel Maus
- Verständnisfrage zu Zeichensätzen bei Mysql
- Prev by Date: Re: Fulltext suche verwenden
- Next by Date: Re: Verständnisfrage zu Zeichensätzen bei Mysql
- Previous by thread: Verständnisfrage zu Zeichensätzen bei Mysql
- Next by thread: Re: Verständnisfrage zu Zeichensätzen bei Mysql
- Index(es):
Relevant Pages
|