Zeichensatzproblem mit MySQL-Insert

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Patrick
User
Beiträge: 49
Registriert: Montag 5. Juli 2004, 06:35
Wohnort: Berlin
Kontaktdaten:

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
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

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.
Kompottkin
User
Beiträge: 21
Registriert: Sonntag 26. Februar 2006, 03:09
Wohnort: Penzberg
Kontaktdaten:

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...
Antworten