Ich kann keine gültige Zeichenfolge von einem MSSQL-Server in Python abrufen. Ich glaube, irgendwo gibt es ein Kodierungs-Missverhältnis. Ich glaube, es ist zwischen der ODBC-Schicht und Python, weil ich lesbare Ergebnisse in Tsql und Isql erhalten kann.Wie konfiguriere ich pyodbc, um Zeichenfolgen von SQL Server mit freeTDS und unixODBC korrekt zu akzeptieren?
Welche Zeichencodierung erwartet pyodbc? Was muss ich in der Kette ändern, damit dies funktioniert?
Spezifisches Beispiel
Hier ist ein vereinfachtes Python-Skript als Beispiel:
#!/usr/bin/env python
import pyodbc
dsn = 'yourdb'
user = 'import'
password = 'get0lddata'
database = 'YourDb'
def get_cursor():
con_string = 'DSN=%s;UID=%s;PWD=%s;DATABASE=%s;' % (dsn, user, password, database)
conn = pyodbc.connect(con_string)
return conn.cursor()
if __name__ == '__main__':
c = get_cursor()
c.execute("select id, name from recipe where id = 4140567")
row = c.fetchone()
if row:
print row
Die Ausgabe dieses Skripts ist:
(Decimal('4140567'), u'\U0072006f\U006e0061\U00650067')
Alternativ kann, wenn die letzte Zeile Das Skript wird geändert in:
print "{0}, '{1}'".format(row.id, row.name)
Dann ist das Ergebnis:
Traceback (most recent call last):
File "/home/mdenson/projects/test.py", line 20, in <module>
print "{0}, '{1}'".format(row.id, row.name)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
Ein Transkript mit Tsql die gleiche Abfrage auszuführen:
[email protected]:~# tsql -S cmw -U import -P get0lddata
locale is "C"
locale charset is "ANSI_X3.4-1968"
using default charset "UTF-8"
1> select id, name from recipe where id = 4140567
2> go
id name
4140567 orange2
(1 row affected)
und auch in isql:
[email protected]:~# isql -v yourdb import get0lddata
SQL> select id, name from recipe where id = 4140567
+----------------------+--------------------------+
| id | name |
+----------------------+--------------------------+
| 4140567 | orange2 |
+----------------------+--------------------------+
SQLRowCount returns 1
1 rows fetched
So Ich habe am Morgen daran gearbeitet und sah hoch und niedrig und habe nicht herausgefunden, was nicht stimmt.
Einzelheiten
sind hier Version Details:
- Client ist Ubuntu 12.04
- freetds v0.91
- unixodbc 2.2.14
- Python 2.7.3
pyodbc 2.1.7-1 (aus dem Paket ubuntu) & 3.0.7-beta06 (aus den Quellen kompiliert)
Server ist XP mit SQL Server Express 2008 R2
Hier werden die Inhalte von wenigen Konfigurationsdateien auf dem Client sind.
/etc/freetds/freetds.conf
[global]
tds version = 8.0
text size = 64512
[cmw]
host = 192.168.90.104
port = 1433
tds version = 8.0
client charset = UTF-8
/etc/odbcinst.ini
[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
CPTimeout =
CPReuse =
FileUsage = 1
/etc/odbc.ini
[yourdb]
Driver = FreeTDS
Description = ODBC connection via FreeTDS
Trace = No
Servername = cmw
Database = YourDB
Charset = UTF-8
In meiner fortlaufenden Arbeit habe ich jetzt die neueste Version von pyodbc, 3.0.7-beta06, _but_ keine Änderung im Verhalten zusammengestellt. – MatthewD