Re: Verständnisfrage zu Zeichensätzen bei Mysql



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
.



Relevant Pages

  • Re: Zeichensatz
    ... daß für MySQL keine Verbindung besteht zwischen ... dem Encoding von Daten in den Tabellen und dem Encoding, ... Wenn ich da jetzt latin-Bücher reinstelle werden die trotzdem in UTF-8 ...
    (de.comp.datenbanken.mysql)
  • Re: stand or sit?
    ... > it's imported into a MySQL database, and I am not sure what ... > encoding is used there. ... interface to utf-8, strings would automatically be handed on as ... > someone to split a single-page graphic into the individual graphics ...
    (soc.motss)
  • Re: Zugriff auf MySQL: Unsupported character encoding
    ... MySQL theoretsich eine Spalte einer Tabelle ein anderes Encoding haben ...
    (de.comp.lang.java)
  • Re: like
    ... in meiner DB habe ich eine Tabelle Ort. ... Das Problem liegt ja bei der Schreibweise in mysql. ... Vielleicht suchst du LIKE 1006_114.plz? ... wenn man in einer Spalte typ Text etwas sucht. ...
    (de.comp.datenbanken.mysql)
  • Auditlog per Trigger
    ... In einer unbestimmten Tabelle wird ein Update ausgeloest. ... declare @MySql as nvarchar ... FETCH NEXT FROM mycur INTO @ChangedField ...
    (microsoft.public.de.sqlserver)