SQLite Sonderzeichen UTF-8

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
akhof
User
Beiträge: 104
Registriert: Mittwoch 11. Mai 2011, 19:07
Kontaktdaten:

Hallo!

Ich versuche gerade Umlaute und Sonderzeichen in meine SQLite-Datenbank einzuspeisen, was aber kläglich scheitert :(
Dazu muss ich noch sagen, dass ich mich mit UTF-8, usw. so garnicht auskenne, und noch nie etwas auf diesem Gebiet gemacht habe.

Ich habe schonmal im Intenet gesucht und habe folgenen Forum-Eintrag entdeckt: http://www.python-forum.de/viewtopic.php?p=104590.

Ich glaube das ist ungefähr das, was ich suche.
Leider habe ich keine Ahnung, wie ich das anwende :K

Ich würde mich also sehr über Tipps freuen!

akhof

NACHTRAG: Ich verwende übrigens SQLite3
BlackJack

@akhof: Der Beitrag den Du verlinkst bezieht sich auf ein ganz konkretes Problem mit der Software Trac wo Daten unterschiedlich kodiert in der Datenbank gelandet sind. Hast Du wirklich *das* Problem?

Was heisst denn überhaupt „kläglich gescheitert”? Was hast Du genau gemacht, was ist genau passiert, welchen Fehler gibt das genau oder in wie fern weicht das von dem ab was Du erwartet hast? Ohne diese Informationen ist alles was man konkret sagen kann, dass Du halt irgend etwas falsch machst.

Wenn Du mit Text arbeitest, solltest Du Unicode verwenden. Lektüre dazu ist zum Beispiel „Von Umlauten, Unicode und Encodings” im Wiki, oder die Python Unicode-FAQ.
akhof
User
Beiträge: 104
Registriert: Mittwoch 11. Mai 2011, 19:07
Kontaktdaten:

Danke ersteinmal für die schnelle Antwort!

Die Fehlermeldung lautet:

Code: Alles auswählen

'ascii' codec can't encode character u'\xe4' in position 0: ordinal not in range(128)
Ich habe folgendes probiert:

Code: Alles auswählen

frage = str(frage).decode("utf-8")
bzw.

Code: Alles auswählen

frage = str(frage).decode("iso-8859-1")
Beides gibt die oben stehende Fehlermeldung zurück :(

akhof

Nachtrag: in frage steht z.B. "ü"
deets

Wie ist denn frage definiert? Als unicode-literal, also mit einem fuehrenden u""?

Wenn ja, dann ist dein code da voellig sinnlos - denn mit str(frage) erzwingst du eine enkodierung von unicode zu einem byte-string - und da du keine angabe machst welches encoding dabei verwandt werden soll, fliegt das natuerlich.

danach willst du das ganze dann aber gleich wieder dekodieren - das ist dann ja voellig sinnlos, denn du hattest ja schon unicode zu beginn...

wie gesagt, das gilt nur fuer die annahme, das frage ein unicode-literal ist.
akhof
User
Beiträge: 104
Registriert: Mittwoch 11. Mai 2011, 19:07
Kontaktdaten:

Die Variable ist ein String; ohne ein "u"-davor - das meintest Du doch, oder?

Aber anscheinend klappt es mit nem unicode auch nicht, oder?
denn:

Code: Alles auswählen

unicode("ä")
gibt ja auch einen Fehler zurücl...
BlackJack

@akhof: Welche Python-Version? Wenn es Python 3.x ist, dann bleibt es dabei was deets gesagt hat. Bei Python 2.x kann an der Stelle diese Ausnahme nicht kommen wenn `frage` an etwas vom Typ `str` gebunden ist.

Zeige doch mal ein minimal lauffähiges Beispiel, das dieses Problem aufweist. Und komplette Tracebacks, damit man nicht raten muss wo genau das Problem auftritt.

Edit: ``unicode('ä')`` ergibt aber eine *andere* Ausnahme! Bitte genau darauf achten welche Operation durchgeführt werden soll und welche Ausnahme kommt. ``encode`` und ``decode`` sind zwei unterschiedliche Richtungen!
akhof
User
Beiträge: 104
Registriert: Mittwoch 11. Mai 2011, 19:07
Kontaktdaten:

Ich benutze in diesem Fall (weil die GUI mit wxPython läuft) noch mit Python 2.7.2
Hier also das Beispiel:

Code: Alles auswählen

def write_db():
    frage = text_input.GetValue() #type=str

    ##########################
    ##dann habe ich versucht:#


    frage = unicode(frage)


    ##########################

    conn = sqlite3.connect([...])
    c = [...]
    c.execute("INSERT INTO Eintraege VALUES({0})".format(frage))

write_db()
NACHTRAG: wenn Frage = "ä" ist, nimmt die Datenbank die Werte entweder nicht an, oder der Versuch mit "unicode" scheitert... (siehe oben: Fehlermeldung)


Ich hoffe Ihr könnt mir helfen...

Vielen Dank schoneinmal

akhof
deets

woher weisst du, dass frage vom typ str ist? hast du dir das ausgeben lassen?

und man benutzt *NIEMALS* string-formatting, um SQL zu erzeugen! Denn dann beantworte ich deine "frage" mit "''); drop tables;" und die DB ist futsch. Bitte benutz die parametrisierte Form von cursor.execute- - da gibt es genug Beispiele & disukssionen hier im Forum und woanders.
akhof
User
Beiträge: 104
Registriert: Mittwoch 11. Mai 2011, 19:07
Kontaktdaten:

<type 'str'>
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bitte setze doch mal die Hinweise um und gehe auch auf die von BlackJack angesprochenen Dinge ein.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
akhof
User
Beiträge: 104
Registriert: Mittwoch 11. Mai 2011, 19:07
Kontaktdaten:

AH...
Ich hab schon eine Lösung gefunden; jemand in nem nl-forum hatte das selbe problem :D
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

akhof hat geschrieben:AH...
Ich hab schon eine Lösung gefunden; jemand in nem nl-forum hatte das selbe problem :D
Vielleicht magste sie hier dennoch mal posten - ggf. freut sich ein später suchender dann auch über die Lösung ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@akhof: Hast Du das mit dem Typ auch überprüft wenn die Eingabe etwas ausserhalb von ASCII enthält? Wie genau sieht denn dann der Inhalt aus? Die `repr()`-Form bitte, denn dann sieht man ohne irgendwelche Interpretationen was genau der Wert enthält. Ich vermute nämlich das *dann* nicht `str` sondern `unicode` geliefert wird.

Du musst Dich auf jeden Fall mal mit `unicode`, `str`, und Kodierungen auseinander setzen. Und nicht einfach nur ``unicode(frage)`` schreiben und hoffen das das schon irgendwie auf magische Weise funktioniert.
akhof
User
Beiträge: 104
Registriert: Mittwoch 11. Mai 2011, 19:07
Kontaktdaten:

Du hast Recht:


Code: Alles auswählen

"'\\xc3\\xa4'"


Danke! :D
deets

Erm, das ist doch keine wirklich nutzbare Antwort. Und *VERSTANDEN* hast du das auch nicht, oder? Also wird es dir beim naechsten mal wieder um die Ohren fliegen. Bitte, lies ein tutorial zu unicode in Python durch - du wirst sonst immer nur von Problem zu Problem lavieren.
Antworten