Encoding-Problem

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

jens hat geschrieben:btw. bei MySQL kann man beim erstellen einer Datenbank auch ein encoding angeben. Ist das evtl. auch bei Oracle möglich?
Möglich? Ich lege ja keine Datenbank an. Die Datenbank selber liegt auch auf einem Server. Hab ich ein neues Projekt, gibt mir unser DBA entsprechend einen neuen Nutzer und Rechte zum Tabellen anlegen.
jens hat geschrieben: Hast du dir aus meiner google suche die Seite http://osdir.com/ml/python.db.cx-oracle ... 00007.html angesehen? Da ist was mit select value from v$nls_parameters where parameter = 'NLS_CHARACTERSET'
Hab ich angeguckt, weiß aber im Moment nicht wie mir das weiterhelfen kann und noch keine Zeit hatte da jetzt genauer zu gucken. Bin ja parallel dabei noch eine alternative Lösung zu finden, falls das jetzt alles nicht klappen sollte. Wie gesagt, ich muss bis Ende der Woche spätestens das Problem gelöst haben, eigentlich schon vor 2 Tagen.
jens hat geschrieben: Mit was siehst du denn, ob die Daten richtig sind oder nicht? Vielleicht zweigt dein Datenbank-anguck-programm die Daten einfach nur falsch an.
^^ meine Datenbank-Anguckprogramme: SQLDeveloper und ArcGIS 9.3 Catalog. Zeigen beide das identische an. Wie bereits auch schon mal geschrieben, hatte ich das ja auch schon vermutet, dass beide vielleicht identisch nur irgendwas anzeigen, was im Hintergrund anders gespeichert ist. Nur: das ArcGIS muss die Daten weiterverarbeiten können und muss in dem Fall Adressen suchen - hab das getestet. Zum Suchen wird der Anzeige-String benutzt, in dem Sonderzeichen stehen.
BTW: wenn ich die csv-Datei, die eigentlich eine xlxs ist über ArcCatalog importiere und da eine Datenbanktabelle draus mache, sind alle Umlaute korrekt. (.. mmhhhh.... den Umweg könnte ich immer noch gehen, meine Script-Ergebnisse in eine neue csv schreiben, die fix in Excel importieren und dann so importieren... aber das ist doof, weil ich wissen warum das alles nicht klappt )
jens hat geschrieben: Vergleich das doch mal direkt in Python, ungefähr so:
TEST_STRING = u'\xe4'
insert mit TEST_STRING.encode("cp1252")
select des wertes, dann ein print select_result.decode("cp1252") == TEST_STRING
Ergebnis:

Code: Alles auswählen

print row[1].decode("cp1252")
print repr(row[1].decode("cp1252"))
print row[1].decode("cp1252") == test

# ausgeben in der MyEclipse Console:
?
u'?'
False
BlackJack

Habe mal kurz in die `cx_Oracle`-Dokumentation geschaut und gesehen, dass `Connection`-Objekte die Attribute `encoding` und `nencoding` haben. Was sagen die denn?

Und kann man Oracle vielleicht per "SQL" irgendwie sagen, welche Kodierung man gerne hätte?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

OK, dann kannst du also quasi nicht selber eine Datenbank anlegen und mußt das nehmen was da ist... Genau dann wird aber dieser Select Befehl mit NLS_CHARACTERSET interessant. Setzt den mal ab und schau nach was er zurück liefert.

meneliel hat geschrieben:

Code: Alles auswählen

# ausgeben in der MyEclipse Console:
?
u'?'
False
Da es ein Fragezeichen ist, wurde irgendwann ein decode mit Fehlerbehandlung 'replace' gemacht (s. http://docs.python.org/dev/library/stdt ... str.decode ). Da du das nicht gemacht hast, hat es wohl der Datenbank Adapter getan. Ich gehe einfach davon aus, das cp1252 falsch ist. Du könntest eine Routine bauen, die einfach mal alle möglichen Codecs durchgeht und schau bei welchem es klappt. Irgendwie doof, aber vielleicht aufschlußreiche.
Hab sowas mal für MySQLdb gemacht, siehe: http://www.python-forum.de/topic-8002.html
Der Sourcecode ist noch online: http://paste.pocoo.org/show/301/

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