Problem mit doppelt kodierten Daten

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Hase
User
Beiträge: 100
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Hallo,
ich habe ein recht komplexes Python-Programm (SqlAlchemy/Elixir-Basis), dass auf eine MySQL-DB zugreift. Es ist eine rein interne Anwendung die ich in dieser Form etwa 10 Mal auf verschiedenen Rechnern in verschiedenen Büros installiert habe, unter Windows und Linux. Dabei gab es nie Schwierigkeiten. Die Datenbank wurde dabei mit einem Dump der Referenzinstallation gefüllt. Nun habe ich meinen eigenen Rechner von OpenSuse auf Ubuntu Oneiric (wg. dauernder Querelen mit KDE) umgestellt, und ich kriege es nicht mehr zu laufen.

Folgende Fehlermeldung kommt so oder ähnlich beim Zugriff:

Code: Alles auswählen

  File "/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.6.7-py2.7.egg/sqlalchemy/processors.py", line 69, in process
    return decoder(value, errors)[0]
  File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe4 in position 8: invalid continuation byte
Nach langer Suche habe ich folgendes feststellen können:
1. Die vorhandenen Daten in der DB sind definitiv korrekt utf-8 kodiert, bei Zugriff darauf erfolg o.g. Fehlermeldung
2. Bei Neueingabe von Daten in die DB sind diese innerhalb der DB doppelt utf-8 kodiert, bei Zugriff darauf erfolgt die Anzeige korrekt (!) ohne Fehlermeldung
3. Lasse ich das Python-Programm auf meinem Rechner laufen, greife aber dabei auf die Referenz-DB auf einem entfernten Rechner zu, kommt ebenfalls die Fehlermeldung, obwohl das selbe Programm auf dem Referenzrecher funktioniert.
4. Ich habe verschiedene Python-Versionen und sqlalchemy-Versionen durchprobiert, immer das gleiche Ergebnis, nämlich die obige Fehlermeldung, wenn auf vorhandene Daten zugegriffen wird

Mein Verdacht: irgendwas passiert mit den Daten zwischen dem Ausgang MySQL und dem Eingang bei SqlAlchemy bzw. umgekehrt, es erfolgt nämlich eine weitere, zusätzliche utf-8 kodierung bzw. dekodierung. Und es könnte was mit Ubuntu Oneiric zu tun haben, denn das selbe Python-Programm läuft ohne ein Byte Änderung auf anderen Rechnern mit Windows und Linux in verschiedenen Versionen problemlos. Mein Ubuntu ist auch voll auf UTF-8 eingestellt, soweit ich das sehen kann.

Kann mir jemand erklären, wass genau passiert zwischen der Datenausgabe bei MySQL und dem Eingang bei Python? Nimmt MySQLdb evtl. Änderunen vor, oder werden die Daten da einfach nur durchgereicht? Wo könnte die zusätzliche kodierung/dekodierung stattfinden? :K

Danke für die Hilfe

Hase
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Vermutung: Schau dir mal an, was für ein Transfer-Encoding bei MySQL unter Suse eingestellt ist. Bei Debian / Ubuntu ist es nämlich Laitn-1. Wenn's unter Suse was anderes ist könnte das eine Ursache sein.

Gruß, noisefloor
Hase
User
Beiträge: 100
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Problem gelöst, wenn auch nicht 100% verstanden.

Ich denke weiterhin, das MySQLdb der Schuldige ist.

Das Problem kann durch explizite Angabe des Encodings in SqlAlchemy abgestellt werden. SqlAlchemy reicht diesen Parameter dann an MySQLdb weiter. Ich habe in meiner Konfigurationsdatei die Zeile:

Code: Alles auswählen

sqlalchemy.dburi="mysql://username:passwd@localhost:3306/mydb"
in

Code: Alles auswählen

sqlalchemy.dburi="mysql://username:passwd@localhost:3306/mydb?charset=utf8"
geändert.

H.
Antworten