mysql und umlaute -- ubuntu

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
rogen
User
Beiträge: 85
Registriert: Dienstag 29. März 2005, 17:45
Wohnort: neustift
Kontaktdaten:

wie bekomme ich einen umlaut in die datenbank

hier mein test code.

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-


from MySQLdb import * 

class mysqlabfr:
    def __init__(self):
        self.conn = connect(host="localhost",db="test2",user="root",passwd="")
   
    def einf(self,text1,text2):
        cursor = self.conn.cursor()
        a = "INSERT INTO test VALUES(0,'"+str(text1)+"','"+str(text2)+"')"
        print a
        cursor.execute(a)
        

daten = mysqlabfr()
daten.einf("testäöo","test")

da kommt die fehlermeldung.

INSERT INTO test VALUES(0,'te�st','test')
Traceback (most recent call last):
File "test.py", line 20, in ?
daten.einf(u"te�st","test")
File "test.py", line 16, in einf
cursor.execute(a)
File "/usr/lib/python2.4/site-packages/MySQLdb/cursors.py", line 146, in execute
query = query.encode(charset)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 29: ordinal not in range(128)


ich habe im forum gesucht aber leider nicht das richtige gefunden.

mfg

gerhard rogen
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Du musst die strings als unicode einfügen in SQLite. Hatte damals auch das Problem. Speichern tut er es erstmal so, aber wenn man dann die Daten von der DB lesen will meckert die SQL-Funktionen.

Moment ich kuck mal kurz wie ich das gemacht habe.

EDIT: Finde die Source nicht (ist glaube ich schon wider in Müll gelandet)
Probiere ein u vor "zu setzen.

Wenn du später die Daten von einer Datei einliest und sie in die DB einfügen willst musst du mit '.encode()' oder '.decode()' arbeiten oder du öffnest die Datei mi 'codecs.open(DATEINAME, MODUS, CODEC)' statt 'file()'. (Die Datei muss aber im richtigen Codec gespeichert sein.)
rogen
User
Beiträge: 85
Registriert: Dienstag 29. März 2005, 17:45
Wohnort: neustift
Kontaktdaten:

das mit dem u funktioniert leider nicht.

komisch ist, dass es unter suse10.1 funktioniert hat.

mfg
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

rogen hat geschrieben:wie bekomme ich einen umlaut in die datenbank
Hi Gerhard!

Ich habe kein MySQL installiert, aber ich glaube, so sollte es funktionieren:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-

import MySQLdb


def einf(self, text1, text2):
    
    conn = MySQLdb.connect(host = "localhost", db = "test2", user = "root", passwd = "")
    cur = conn.cursor()
    
    sql = "INSERT INTO test VALUES (0, ?, ?)"
    cur.execute(sql, (text1, text2))
    conn.commit()


einf(u"testäöo", u"test")
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
rogen
User
Beiträge: 85
Registriert: Dienstag 29. März 2005, 17:45
Wohnort: neustift
Kontaktdaten:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-

import MySQLdb


def einf(text1, text2):
   
    conn = MySQLdb.connect(host = "localhost", db = "test2", user = "root", passwd = "")
    cur = conn.cursor()
   
    sql = "INSERT INTO test VALUES (0, ?, ?)"
    cur.execute(sql, (text1, text2))
    conn.commit()


einf(u"testäöo", u"test")

kommt:
rogen@rogen-desktop:~$ python test.py
Traceback (most recent call last):
File "test.py", line 16, in ?
einf(u"test��o", u"test")
File "test.py", line 12, in einf
cur.execute(sql, (text1, text2))
File "/usr/lib/python2.4/site-packages/MySQLdb/cursors.py", line 148, in execute
query = query % db.literal(args)
TypeError: not all arguments converted during string formatting
rogen@rogen-desktop:~$
BlackJack

Dann ersetz die '?' durch '%s'.
rogen
User
Beiträge: 85
Registriert: Dienstag 29. März 2005, 17:45
Wohnort: neustift
Kontaktdaten:

das war es.

vielen dank

gerhard rogen
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Dein erster Ansatz war, das SQL-Query mittels einfacher %-Formatierung zu bauen. Das ist aber ausdrücklich *nicht* zu tun, da es eben u.a. solche automatischen Umlaut-Encoding-Geschichten nicht ermöglicht, aber andererseits Angriffen durch SQL-Injection Tür und Tor öffnet.

Deshalb sieht PEP 249: Python Database API Specification v2.0 vor, dass die Methoden den Query mit Platzhaltern sowie die Parameter als separates Argument entgegen nehmen sollen. Leider kann jede Implementierung das Aussehen der Platzhalter selbst wählen, bei MySQLdb ist dies, wie richtig genannt wurde, '%s' - bitte genau aufpassen und nicht mit der normalen %-Formatierung verwechseln!


XtraNine: Wie kommst du bitte auf SQLite, wo es doch ganz offentsichtlich um MySQL geht? :)
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Y0Gi hat geschrieben:[...]
XtraNine: Wie kommst du bitte auf SQLite, wo es doch ganz offentsichtlich um MySQL geht? :)
Ja ne hast schon recht. Ich hatte damals halt das gleiche Problem aber mit SQLite :) Naja, MySQL, SQLite,... ist doch alles der gleiche Käse *gg
geraldf
User
Beiträge: 5
Registriert: Montag 20. November 2006, 19:43

Hallo allerseits,

beim Thema "Umlaute" spielt die Version von MySQLdb eine Rolle.
Siehe auch http://www.python-forum.de/topic-8002.html
Beste Grüße
Gerald
Antworten