Umlaute in SQLite

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Scriptonator
User
Beiträge: 14
Registriert: Mittwoch 23. Februar 2011, 18:16

Hallo, ich habe schon die SuFu genutzt, aber nichts richtiges gefunden, bzw die Verlinkungen waren out-of-date, daher poste ich mein Problem.

Ich habe eine SQLlite3 Datenbank, in der ich local auf meinem Rechner einige Daten verwalten möchte.
In diesen kommen Umlaute vor, und da ist mein Problem.

Ich habe schon folgende Zeile in mein Script hinzugefügt:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
Wenn ich jetzt z.B.

Code: Alles auswählen

print "Zähler"
schreibe, dann funktioniert das auch.

So, nun lese ich aber eine Textdatei aus, prüfe deren Zeile auf Doppelinhalt und speichere diese danach in die DB.
In der Datenbank sind die Umlaute schon "kaputt" ( Dreiecke mit ? )
Wenn ich mir die Daten ausgeben lasse, dann werden diese "kaputten" Umlaute als \xf oder so ähnlich dargestellt.

Meine Fragen lauten:
1. Wie kann man das Charset von der DB auf UFT-8 stellen? Query?
2. Wo könnte sonst noch mein Fehler liegen?

Code:

Code: Alles auswählen

con= m.connect("emails.db")
con.text_factory = str
c=con.cursor()
...

def check_double(f):
    print "[*]Reading and Checking file"
    valid=[]
    for line in f:
        line = line.strip() 
        if not line in valid:
            valid.append(line)
        else:
            pass
    valid.sort()
    print "[*]Reading and Checking file finished"
    return valid

...
def insert_none():
    file_name=raw_input("File to read: ")
    file=open(file_name,"r")
    count=0
    zeilelist=check_double(file)
    print "[*]Starting to fill Database"
    for line in zeilelist:
        line=line.strip()
        count=count+1
        try:
            c.execute("INSERT INTO zeile  (zeile,md5,clear) VALUES('"+line+"','','')")
            print "[%d]Inserted" %count
        except m.Error:
            print "[%d]Passed" %count
            pass
    print "[*]Done %d zeilen" % count
    con.commit()

...

def manuell():
    sql=raw_input("Query: ") """ z.B. select * from zeile """
    try:
        c.execute(sql)
        for row in c:
            print row
    except m.Error as err:
        print err
        pass
    con.commit()
Gruß
Scriptonator
User
Beiträge: 14
Registriert: Mittwoch 23. Februar 2011, 18:16

So, Problem hat sich fast von selbst behoben.

ICh habe mir nicht einfach das Tupel ausgeben lassen, oder das folgendermaßen gemacht, und dann wird wieder alles richtig dargestellt / gespeichert.

Code: Alles auswählen

            zeile = row
            if(write):
                file.write(zeile+"\n")
            else:
                print "%s" % zeile

Gruß
Antworten