SQLAlchemy und UnicodeDecodeError

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Daishy
User
Beiträge: 21
Registriert: Samstag 4. April 2009, 12:40
Kontaktdaten:

Hi zusammen.

Ich versuche momentan mit Turbogears eine kleine Webseite ans laufen zu bekommen, allerdings pruegel ich mich schon seit zwei Tagen mit den Zeichensaetzen ^^.

Datenbank ist MySQL komplett auf UTF8: (Auszug aus show variables)

Code: Alles auswählen

character_set_client	utf8
character_set_connection	utf8
character_set_database	utf8
character_set_filesystem	binary
character_set_results	utf8
character_set_server	utf8
character_set_system	utf8
collation_connection	utf8_general_ci
collation_database	utf8_general_ci
collation_server	utf8_general_ci
Mein Model sieht wie folgt aus:

Code: Alles auswählen

# -*- coding: utf-8 -*-
...
adressTable = Table('adressen', metadata,
  Column('id', Integer, primary_key=True),
  Column('vorname', 
String)
)
Ist die Option #sqlalchemy.convert_unicode=True ausgeschaltet, dann kann ich im Controller ein Query durchfuehren, und dieses Query per print direkt ausgeben (Typ ist zu dem Zeitpunkt str), allerdings bekomme ich dann im Template einen UnicodeDecodeError (es wird versucht in 'ascii' zu decodieren, was ja nicht geht, weil die Daten utf8 sind)

Schalte ich die Option an, so schaegt das Query schon im Controller fehlt:

Code: Alles auswählen

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 5-10: unsupported Unicode code range
Hab schon wie ein bloeder gegooglet, aber die Tipps die ich gefunden haben bringen mich immer entweder zu dem einen oder dem anderen Fehler. Falls noch Informationen gebraucht werden, bitte einfach posten, ich liefer die dann sofort nach.

Vielen Dank und Schoene Gruesse,
Daishy
Daishy
User
Beiträge: 21
Registriert: Samstag 4. April 2009, 12:40
Kontaktdaten:

Also ich habe grade nochmal etwas rumprobiert und mal probiert in meinem Controller die Daten per Hand zu encodieren.

Code: Alles auswählen

for row in set:
  uni = row.vorname.decode("latin-1") # Geht
  uni = row.vorname.decode("utf-8") # Schlaegt Fehl
Also scheinen die Daten ja beim uebertragen vom Server immernoch in Latin-1 umcodiert zu werden. Wie koennte ich SQLAlchemy denn sagen, dass er es statt utf8 mal mit latin-1 versuchen soll?
Daishy
User
Beiträge: 21
Registriert: Samstag 4. April 2009, 12:40
Kontaktdaten:

Es scheint wirklich daran zu liegen, das MySQL immer noch latin-1 sendet. Nachdem ich dem Verbindungsstring nach explizit encoding="latin1" mitgegeben habe, hat er alles richtig codiert. Ist zwar irgendwie eine komische Loesung (da erst UTF-8->Latin->Unicode) aber es funktioniert erstmal ^^
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

Spalte 'vorname' sollte wohl Unicode und nicht String sein.
http://www.felix-benner.com
Daishy
User
Beiträge: 21
Registriert: Samstag 4. April 2009, 12:40
Kontaktdaten:

Hi,
Aendert leider auch nichts an dem Verhalten. Ich hab es jetzt auf autoload gestellt und convert_unicode auf true und krieg Unicode-Objekte geliefert.
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Ja, es liegt tatsächlich an der Codierung der Übertragung (Hab mich letzte Woche auch mit rumgeschlagen). Hänge einfach an den Connectionstring ein "?charset=utf8" ran, und das Problem ist Vergangenheit.
Antworten