[Postfixbuch-users] DB-Queries

Stefan G. Weichinger lists at xunil.at
Mo Mär 19 11:14:41 CET 2012


Am 17.03.2012 00:54, schrieb Christian Boltz:
> 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.

danke für die vielen Pointer und Infos ...

Ich muß da erst die Zeit dazu finden. Eigentlich will ich nur, daß die
eine kleine Tabelle korrekt funktioniert ...

Danke, Stefan



Mehr Informationen über die Mailingliste Postfixbuch-users