Seite 1 von 1
SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 08:17
von akhof
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
Re: SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 09:33
von 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.
Re: SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 11:41
von akhof
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:
bzw.
Beides gibt die oben stehende Fehlermeldung zurück
akhof
Nachtrag: in frage steht z.B. "ü"
Re: SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 11:56
von 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.
Re: SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 12:06
von akhof
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:
gibt ja auch einen Fehler zurücl...
Re: SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 12:11
von 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!
Re: SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 12:32
von akhof
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
Re: SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 12:41
von 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.
Re: SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 13:43
von akhof
<type 'str'>
Re: SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 13:50
von Hyperion
Bitte setze doch mal die Hinweise um und gehe auch auf die von BlackJack angesprochenen Dinge ein.
Re: SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 13:52
von akhof
AH...
Ich hab schon eine Lösung gefunden; jemand in nem nl-forum hatte das selbe problem

Re: SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 13:53
von Hyperion
akhof hat geschrieben:AH...
Ich hab schon eine Lösung gefunden; jemand in nem nl-forum hatte das selbe problem

Vielleicht magste sie hier dennoch mal posten - ggf. freut sich ein später suchender dann auch über die Lösung

Re: SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 13:57
von 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.
Re: SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 13:59
von akhof
Du hast Recht:
Danke!

Re: SQLite Sonderzeichen UTF-8
Verfasst: Sonntag 11. März 2012, 14:07
von 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.