ascii codec can't encode characters

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
reneschmidt
User
Beiträge: 48
Registriert: Montag 4. Januar 2016, 15:14

Hallo zusammen,

folgendes Problem:

Ich muss per Script etliche Datensätze in einer MSSQL Datenbank angelegt. Die MSSQL Datenbank spreche ich per pyodbc an.
Nun ist es leider so, das einige Spalten einen Umlaut im Namen haben. (z.B. gibt es die Spalte Führerschein). Wenn ich diese jetzt im INSERT mit Anspreche bekomme ich immer folgende Meldung:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 352-353
Als Datengrundlage dient mir eine CSV Datei in der ggf auch Umlaute bei den einzelnen Werten sind.
Wie kann man da jetzt mit umgehen?
Ich habe schon probiert den String in UTF zu Konvertieren:
sql = sql.decode('utf8')
leider ohne erfolg.

Vielen Dank für die Hilfe.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@reneschmidt: zeig doch, was Du versucht hast.
IHack
User
Beiträge: 14
Registriert: Dienstag 13. März 2018, 11:17

Welches Quell- und welches Zielsystem?
(Win- und *nix- Welt haben da ihre eigenen Probleme)
reneschmidt
User
Beiträge: 48
Registriert: Montag 4. Januar 2016, 15:14

Hallo zusammen,

aktuell hab ich folgendes Probiert:

Code: Alles auswählen

sql = "INSERT INTO " + dbpfad + "[Personal] (....., [Aktuell], [Führerscheinnummer], [Führerscheindatum], [Führerscheinklassen], [Fahrerkartennummer], [FahrerkarteDatum], ...., [LetzterZugriff_Datum]) VALUES (.....)"
print sql
sql = sql.decode('utf8')
print sql
cursor.execute(sql)
in dem Fall fliegt er mir beim zweiten print auf die Nase. Er Mault genau die Umlaute an. (das ü von Führerscheinnummer)

Das Script läuft auf Windows und auch der MS SQL läuft logischerweise auch auf einem Windows.

Im Script Kopf habe ich folgendes stehen:

Code: Alles auswählen

#!C:\Program Files (x86)\python25\python.exe
# -*- coding: utf-8 -*-
Zuletzt geändert von reneschmidt am Sonntag 18. März 2018, 19:39, insgesamt 1-mal geändert.
reneschmidt
User
Beiträge: 48
Registriert: Montag 4. Januar 2016, 15:14

Ich habe auch gerade noch einmal folgendes probiert:
viewtopic.php?t=5095

sql1 = sql.decode("iso-8859-1")
sql2 = sql1.encode("utf-8")

auch das funktioniert wieder nicht. Weder der execute mit sql1 noch mit sql2
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@reneschmidt: hast Du auch wirklich die Datei als UTF8 gespeichert? Dass das im Kommentar oben steht, heißt noch nicht, dass damit auch alle Strings richtig sind.

Schreib das richtige Encoding in den Kommentar und am besten definierst Du die Strings auch gleich als Unicode:

Code: Alles auswählen

sql = u"INSERT INTO [Personal] (....., [Aktuell], [Führerscheinnummer], [Führerscheindatum], [Führerscheinklassen], [Fahrerkartennummer], [FahrerkarteDatum], ...., [LetzterZugriff_Datum]) VALUES (.....)"
Was soll eigentlich die Sache mit dem dbpfad? Beim execute fehlen noch die Values. Die sind hoffentlich nicht schon in den SQL-String hineinformatiert!?
reneschmidt
User
Beiträge: 48
Registriert: Montag 4. Januar 2016, 15:14

Hallo zusammen,

schon mal vielen Dank für die Antworten.
Ich bearbeite das Script mit Notepadd ++. Notepad sagt unten rechts in der Ecke, das die Datei in UTF8 ist.

Ich habe das mal mit dem u vor den " probiert. Leider fällt er jetzt auch wieder da auf die Nase.
Jetzt gibt er die Fehlermeldung für die Zeile aus, in der ich die Variabel SQL definiere...
reneschmidt
User
Beiträge: 48
Registriert: Montag 4. Januar 2016, 15:14

Aktuell haben mir folgende zwei Zeilen geholfen:
reload(sys)
sys.setdefaultencoding('utf-8')

anscheind funktioniert es jetzt.

Vielen Dank.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@reneschmidt: dass jetzt der Fehler beim Definieren des Strings auftaucht, sagt nunmal, dass das Encoding der Datei falsch ist. Versuche mal mit Notepad++ ein anderes Encoding.

Dass die Windows-Konsole falsche Encodings benutzt, ist ein langbekanntes Problem. Aber jetzt mit dem Encoding herumzudoktorn hilft Dir halt maximal bei der Ausgabe, alle anderen Teile des Programms machen es weiterhin falsch.
Antworten