Mysqldb Probleme mit Umlauten

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Fintan
User
Beiträge: 4
Registriert: Donnerstag 19. Juni 2008, 15:44

Hallo,
ich hab Probleme mit den Umlauten beim Auslesen aus einer Datenbank mit dem MysqlDB Modul.

Folgendes ist eingestellt:
Datenbank hat latin1_bin
Daten wurden mit diesem Python Script eingefügt (vorgabe, Zeichensatz: ANSI, hab das Array All_o aber ein bisschen wegen Übersichtlichkeit gekürzt):

Code: Alles auswählen

# coding=latin-1

import MySQLdb

All_o = [
     ["Baden-Württemberg"
       ,["Basel (Schweiz)", "Basel Badischer Bahnhof"]
       ,["Heidelberg", "Heidelberg Karlstor"]
       ,["Kappel-Gutachbrücke", "Bahnhof Kappel-Gutachbrücke"]
       ,["Karlsruhe", "Karlsruhe Hauptbahnhof"]
       ,["Mannheim", "Mannheimer Hauptbahnhof"]
       ,["Offenburg", "Bahnhof Offenburg"]
       ,["Schorndorf", "Bahnhof Schorndorf"]
       ,["St. Georgen im Schwarzwald", "Bahnhof Sankt Georgen im Schwarzwald"]
       ,["Stuttgart", "Stuttgart Hauptbahnhof"]
       ,["Süßen", "Bahnhof Süßen"]
       ,["Tuttlingen", "Bahnhof Tuttlingen"]

   ],["Bayern"

       ,["Allersberg", "Bahnhof Allersberg (Rothsee)"]
       ,["Aschaffenburg", "Aschaffenburg Hbf"]
       ,["Augsburg", "Augsburg Hbf"]
       ,["Bayerisch Eisenstein", "Bahnhof Bayerisch Eisenstein"]
       ,["Coburg", "Bahnhof Coburg, Bahnhöfe in Coburg"]
       ,["Fürth", "Fürth (Bay) Hbf"]
       ,["Hof (Saale)", "Hof Hbf"]
       ,["Marktredwitz", "Bahnhof Marktredwitz"]
       ,["Ismaning", "Bahnhof Ismaning"]
       ,["Kinding", "Bahnhof Kinding (Altmühltal)"]
       ,["München", "München Hbf"]
       ,["Nürnberg", "Nürnberg Hbf"]
       ,["Passau", "Passau Hbf"]
       ,["Plattling", "Bahnhof Plattling"]
       ,["Postbauer-Heng", "Bahnhof Postbauer-Heng"]
       ,["Regensburg", "Regensburg Hbf"]
       ,["Würzburg", "Würzburg Hbf"]
       ,["Zwiesel", "Bahnhof Zwiesel"]

   ]
]

Database_o = MySQLdb.connect(user="root", passwd="", db="web2008")
Cursor_o   = Database_o.cursor()
for LRow in All_o:
   Land_s = LRow[0]
   for SRow in LRow[1:]:
      Cmd_s = "INSERT INTO bahnhoefe (bundesland, stadt, bahnhof) VALUES ('"+Land_s+"', '"+SRow[0]+"', '"+SRow[1]+"')"
      Cursor_o.execute(Cmd_s)
Database_o.commit()
Danach stehen die Daten auch richtig mit Umlauten in der Datenbank.
Jetzt will ich die Daten wie folgt auslesen:

Code: Alles auswählen

db=_mysql.connect("localhost","root","","web2008") 
db.query("SELECT bundesland FROM bahnhoefe group by bundesland;") 
res=db.use_result() 
rows=res.fetch_row(99) 
arr_json = '['
for row in range(len(rows)):
    print type(rows[row])
    if row>0:
        arr_json += ',"%s"'%rows[row]
    else:
        arr_json += '"%s"'%rows[row]
arr_json += ']'
return arr_json
Das Coding habe ich wie beim Insert script auf # coding=latin-1 gesetzt und mit Zeichensatz ANSI gespeichert, bei type sagt er mir type 'tuple'.

Was muss ich jetzt einstellen damit die Umlaute angezeigt werden?
Das Datenbankencoding auf UTF-8 einstellen? Oder mache ich da was beim Auslesen falsch?
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

MySQL und Encoding ist so eine Sache ... Es ist nicht so wichtig, welches Encoding die Tabelle hat, aber du solltest ihm unbedingt mitteilen, welches Encoding du für die Verbindung nutzen möchtest. Hierzu kannst du entweder bei der Erstellung der Verbindung einen zusätzlichen Parameter mitgeben, oder ganz zu Beginn einen SQL-Befehl "SET NAMES ..." absetzen.

Bei beiden Lösungen ist mir die genaue Syntax jetzt nicht geläufig, aber wenn du danach googlest, solltest du fündig werden.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

siehe: [wiki]MySQLdb troubleshooting#Unicoderger[/wiki]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Und bitte die SQL-Queries nicht selbst zusammensetzen (siehe Parametrisierte SQL-Queries im Wiki).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
skymuss

---------------------
Zuletzt geändert von skymuss am Samstag 12. Juni 2010, 10:59, insgesamt 2-mal geändert.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Schau mal hier: [wiki]Easy Install[/wiki]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@Fintan: Bitte lass den Quatsch mit den `_o` bei den Namen. Das ist ja scheusslich. In Python ist alles, was man an einen Namen binden kann, ein Objekt. Das Offensichtliche braucht man nicht noch einmal durch so einen überflüssigen Postfix sagen.

Ausserdem werden nach Style-Guide Namen für Variablen und Funktionen klein_und_mit_unterstrichen geschrieben. Damit kann man sie prima von Klassen unterscheiden, die in "CamlCase" geschrieben werden.

Das in den inneren Listen das erste Element eine andere Bedeutung hat, als der Rest, ist stilistisch nicht so schön.

Für `LRow` und `SRow` lassen sich sicher sprechendere Namen finden. `SRow` könnte man auch gleich in der Schleife auf zwei Namen "entpacken", dann spart man sich die Indexzugriffe auf Stadt und Bahnhof.

Für's JSON würde ich ein entsprechendes Modul empfehlen. Oder zumindest die `join()`-Methode von Zeichenketten verwenden um die Kommata zwischen die Einträge zu bringen.

Wobei ich mir nicht so ganz sicher bin, ob das JSON wirklich so aussehen soll!?
Antworten