[Postfixbuch-users] DB-Queries

Christian Boltz postfixbuch at cboltz.de
Sa Mär 17 00:54:40 CET 2012


Hallo Stefan, hallo Igor, hallo Leute,

Am Freitag, 16. März 2012 schrieb Stefan G. Weichinger:
> Am 16.03.2012 14:44, schrieb Igor Sverkos:

> > damit beim Import nichts kaputt geht (gut, bei Ausgangsdaten latin1
> > und Import als UTF-8 kann nichts passieren, da latin1 wie gesagt
> > eine Untermenge von UTF-8 ist... aber umgekehrt wäre das bspw.
> > fatal).

Latin1 ist keine Untermenge von UTF-8, es ist ein völlig anderer 
Zeichensatz - zumindest ab Position 128. Nur der Bereich mit den ersten 
127 Zeichen ist gleich - der gute alte ASCII-Zeichensatz ;-)

Sprich: Es kann in beiden Richtungen Probleme geben, weil Umlaute etc. 
in UTF-8 anders codiert werden als in latin1. Ein UTF8-"ö" hat zwei Byte, 
ein latin1-"ö" nur eins:

# echo -n ö | tee /dev/stderr | hexdump
ö
0000000 00f6   # latin1

# echo -n ö | recode latin1..utf-8 | tee /dev/stderr | hexdump
ö
0000000 b6c3   # UTF-8

Dann gibt es noch lustige Dinge wie ungültige oder halbe UTF-8 Sequenzen 
(z. B. wäre hex c3 ein "halbes ö") - damit können lustige[tm] und 
weniger lustige[tm] Dinge passieren. Die Details dazu würden aber den 
Umfang dieser Mail sprengen. Bei Interesse: 
http://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences


> head des Dumps:

sieht gut aus.

> > Das CREATE-Statement betrifft nur die Daten, die der mysqld
> > persistieren soll. D.h. solltest UTF-8 Daten in der Tabelle
> > speichern wollen, wäre das (nicht) möglich. Sprich wenn du jetzt
> > einen UTF-8 String dem mysqld übergibst, würde er diesen beim
> > Speichern in latin1 wandeln - dabei gingen also Daten verloren.

Nur wenn sich die Daten nicht in latin1 darstellen lassen. Umlaute werden
problemlos umgewandelt, Klingonisch wird aber nicht mehr funktionieren ;-)

> > Wenn du nichts mit UTF-8 Zeichen am Hut hast, ist latin1 völlig in
> > Ordnung (sogar besser als einfach alles UTF-8 zu machen, Stichwort
> > Speicher).

Stimmt schon, UTF-8 belegt in MySQL den dreifachen Platz, weil ein 
Zeichen bis zu 3 Bytes benötigt - ein varchar(255) wird also 765 Byte 
groß).
Allerdings spielt der Speicherplatzbedarf im Verhältnis zu den 
eigentlichen Mails wohl nicht wirklich eine Rolle ;-)

Das größere Problem ist die maximal mögliche Indexgröße von 1024 Bytes
(nicht Zeichen!). Falls Du also einen unique index über zwei 
varchar(255) brauchst [1], funktioniert das nur mit latin1 - mit UTF-8 
wären die Spalten mit 2*765 Byte zu groß.

Da in Mailadressen kein UTF-8 erlaubt ist (siehe weiter oben im Thread), 
reicht latin1 in der Datenbank.

Davon abgesehen: wenn wirklich eine Mail mit UTF-8 in der Absender-Adresse 
reinkommt, stehen die Chancen ganz gut, dass sie von einem Spammer stammt 
und von der erstbesten Blacklist geblockt wird. Von daher macht es auch 
keinen Unterschied, wenn sie stattdessen von einer Datenbank-Fehlermeldung 
geblockt wird *g*

> > Einzig entscheidend ist, dass wenn du dich mit dem mysqld
> > verbindest,
> > ihm mitteilst in welchem Charset du ihm jetzt Daten übergeben wirst.

Genau.

> Also bin ich jetzt auf dem nächsten Level meiner Paranoia:
> Ich fürchte mich, weil *keine* Fehlermeldung mehr sichtbar ist ...

*lol*

> > Löse also das Ausgangsproblem gleich und kaschiere nichts.
> 
> Das würde ich ja sehr gerne.
> 
> Aber mir raucht schon die Birne von alldem. Wie man merkt.

Kein Wunder. Vor dem
http://blog.koehntopp.de/archives/1360-Zeichensatzaerger.html
sollte man sich erstmal mit den
http://blog.koehntopp.de/archives/1424-MySQL-Zeichensatz-Grundlagen.html
beschäftigen, damit man hinterher nicht 
http://blog.koehntopp.de/archives/3189-FAQ-Mein-mysqldump-zerstoert-meine-Umlaute.html
schreien muss ;-)

Auch wenn ich die Links oben so schön in den Text passen, stehen sie 
nicht zum Spaß da ;-) Die Artikel von Kris sind durchaus lesenswert und
werden Dir beim Verständnis von Zeichensätzen in MySQL helfen.


Gruß

Christian Boltz

[1] real-world-Beispiel: Die Tabelle vacation_notification von PostfixAdmin
    hat so einen Index über zwei varchar(255)-Spalten.

-- 
But a cactus is stable. Have you ever tried to kill a cactus just
running against it? [Kim Leyendecker in opensuse-project]




Mehr Informationen über die Mailingliste Postfixbuch-users