[Postfixbuch-users] DB-Queries

Igor Sverkos igor.sverkos at googlemail.com
Fr Mär 16 10:40:49 CET 2012


Hallo,

fyi:
Es gibt zwei Seiten. Einmal den SQL-Server. Dieser hat einen
Standardzeichensatz (ab MySQL 5.0 war das UTF-8). Dieser wird immer dann
verwendet, wenn der Nutzer keinen Zeichensatz spezifiziert.

Die zweite Seite ist der SQL-Connector. Die Middleware, womit du auf den
SQL-Server zugreifst. Dieser kennt auch einen Zeichensatz.

Wichtig ist jetzt:
Wenn die Anwendung Zeichen in iso-8859-1 vorliegen hat, dann muss der
SQL-Connector auch iso-8859-1 verwenden (SET CHARACTER SET 'latin1').
Sollte ein Default-MySQLd laufen, wird das ab v5.0 UTF-8 sein -- das ist
in dem Falle nicht schlimm, weil latin1 eine Untermenge von UTF-8 ist,
es real also zu keinem Problem kommt und daher kaum einer etwas über die
Problematik weiß.

Anders sieht es aus, wenn der Standardzeichensatz des MySQLd aber bspw.
latin1 statt UTF-8 ist. Hat man es nun bspw. mit UTF-8 Daten zutun und
verbindet normal, gehen Informationen verloren, denn UTF-8 enthält
Zeichen, die in latin1 nicht enthalten sind... die Folge ist Datenmüll :)

Glücklicherweise versucht MySQLd das zu verhindern. Erkennt der
SQL-Server, dass du ihn mit UTF-8 Zeichen über eine latin1 Verbindung
fütterst, wodurch also Informationen abgeschnitten werden, meldet er
diesen "Illegal mix of collations"-Fehler.

Das hat *gar nichts* mit dem Zeichensatz zutun, den eine Datenbank/ein
Datenbankfeld hat. D.h. es ist total unsinnig und falsch wegen der
Meldung eine Datenbank zu konvertieren. Der SQL-Server weiß in welcher
Form er die Daten vorliegen hat (Verbindung) und wohin er sie
konvertieren soll (Definition der Datenbank)... das ist also kein Problem.

Wo liegt als nun das Problem?

Du musst sicherstellen, dass dein Connector die Verbindung mit dem
richtigen Zeichensatz aufbaut.

Postfix verwendet intern nach meinem Wissen UTF-8 (keine Ahnung ob man
das umstellen kann). Folglich muss der Connector die Verbindung auf
UTF-8 stellen.

Das wird - siehe oben - standardmäßig der Fall sein, *wenn* UTF-8 auch
der Standardzeichensatz des MySQLd ist, zu dem man verbindet. Wenn der
SQL-Server aber latin1 standardmäßig verwendet und du als ersten Befehl
kein "SET CHARACTER..." absetzt, kommt es zu dem Fehler.

Verstanden?

Laut deiner bisherigen Fehlermeldung vermute ich, dass du den SQL-Server
warum auch immer auf latin1 eingestellt hast...
Mir ist jetzt nicht bekannt, dass man postfix anweisen kann für jede
Verbindung bitte "SET CHARACTER..." aufzurufen. Wenn du Glück hast liest
der Client eine my.cnf, dann kannst du es hier angeben.. ansonsten wirst
du den Standardzeichensatz des Servers auf UTF-8 ändern müssen.

Weitere Informationen:
http://dev.mysql.com/doc/refman/5.1/de/charset-connection.html


-- 
Ich Grüße,
Igor



Mehr Informationen über die Mailingliste Postfixbuch-users