Seite 1 von 1

Zeichensatzproblem mit MySQL-Insert

Verfasst: Donnerstag 23. Februar 2006, 11:58
von Patrick
Hallo,

ich habe Probleme beim Inserten von Daten aus einem HTML-Formular in eine Datenbank, wenn dieses Formular Sonderzeichen enthaelt.

Ich moechte wie folgt erstmal die Struktur der Datenuebertragung darlegen, ansonsten koennte es zu Missverstaendnissen kommen:

Ein Webserver, dessen Zeichensatz in der Apache- und PHP-Config mit iso-8859-1 angegeben ist, empfaengt via PHP von einem HTML-Formular verschiedene Daten. Diese Daten werden von dem PHP-Script ueber eine XMLRPC-Verbindung an einen anderen Webserver gesendet, der den XMLRPC-Server auf Python-Basis darstellt.

Die dort empfangenen Daten sollen in eine MySQL-Datenbank (dort ist latin1, also auch iso-8859-1 als Charset angegeben) geschrieben werden.

Nun ist es aber so, dass genau beim Schreiben in die MySQL-Datenbank der Fehler auftritt:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Das passiert, wenn man den String mit Sonderzeichen nur als str() castet, oder mit diversen Zeichensaetzen (iso-8859-1, utf-8 ) versucht zu encoden. (auf der Python-Seite)
Auch wenn ich nichts mit diesem String mache und ihn so in die MySQL-Datenbank inserten moechte, funktioniert es leider nicht.

Wenn ich mir den String auf der Python-Konsole ausgebe, den ich uebergeben bekomme, sieht der auch nicht korrekt aus.

z.B.:
mörserrakete
... was 'mörserrakete' darstellen soll.

Weiss jemand, was da schief laeuft?

vielen Dank,
Patrick

Verfasst: Donnerstag 23. Februar 2006, 13:39
von Buell
Das Problem muss nicht zwangsläufig auf Python Seite liegen. Problem ist, wie du es schon richtig erkannt hast, dass Sonderzeichen falsch weitergegeben oder geschrieben werden.

Ich würde zur Fehlereingrenzung mal als zwischen schritt versuchen den String in eine Datei zu schreiben. Wenn dies funktioniert, was ich glaube, wird es nur an der Datenbank liegen. Ich hatte mal ähnliches Problem mit Hochkommas die nicht in MySQL DB geschrieben wurden, aber was ich damals geändert habe ... sorry keine Ahnung mehr. Damals lag es auf jeden Fall an der Datenbank.

Verfasst: Sonntag 26. Februar 2006, 20:00
von Kompottkin
Das passiert, wenn man den String mit Sonderzeichen nur als str() castet, oder mit diversen Zeichensaetzen (iso-8859-1, utf-8 ) versucht zu encoden.
Strings kann man nicht kodieren. Man kann Unicode-Zeichenketten (der Klasse unicode, nicht str) in verschiedene Zeichensätze kodieren, wobei sie zu Strings werden.

Du kannst zum Beispiel schreiben:

Code: Alles auswählen

foo = u"Müller"
print foo.encode('latin-1')
Andersherum kannst Du Latin-1-Zeichenketten dekodieren und damit in unicode-Instanzen umwandeln:

Code: Alles auswählen

foo = "Müller"  # in latin-1
bar = foo.decode('latin-1')
Am besten dekodierst Du die Daten, die Du aus der Datenbank ausliest, nach unicode und arbeitest dann in Deinem Code nur mit unicode-Instanzen und nicht mit rohen Bytestrings. Wenn Du dann etwas in die Datenbank oder sonstwohin schreiben willst (z.B. in eine HTML-Datei), dann kodierst Du das unicode-Objekt entsprechend.

Ich hoffe, meine Erklärung ist nicht zu konfus...