Wie konfiguriere ich pyodbc so, dass Zeichenfolgen von SQL Server mit freeTDS und unixODBC korrekt akzeptiert werden?

Ich kann keine gültige Zeichenfolge von einem MSSQL-Server in Python abrufen. Ich glaube, es gibt irgendwo eine Kodierungsfehlanpassung. Ich glaube, es liegt zwischen der ODBC-Ebene und Python, weil ich in der Lage bin, lesbare Ergebnisse in tsql und isql zu erhalten.

Welche Zeichenkodierung 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')

Wenn alternativ die letzte Zeile des Skripts geändert wird 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)

Eine Abschrift mittsql um die gleiche Abfrage auszuführen:

root@luke:~# 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 inisql:

root@luke:~# isql -v yourdb import get0lddata
SQL>  select id, name from recipe where id = 4140567
+----------------------+--------------------------+
| id                   | name                     |
+----------------------+--------------------------+
| 4140567              | orange2                  |
+----------------------+--------------------------+
SQLRowCount returns 1
1 rows fetched

Also habe ich an diesem Morgen gearbeitet und sah hoch und niedrig aus und habe nicht herausgefunden, was los ist.

Einzelheiten

Hier sind Versionsdetails:

Client ist Ubuntu 12.04freetds v0.91unixodbc 2.2.14Python 2.7.3

pyodbc 2.1.7-1 (aus dem Ubuntu-Paket) & 3.0.7-beta06 (aus dem Quellcode kompiliert)

Server ist XP mit SQL Server Express 2008 R2

Hier finden Sie den Inhalt einiger Konfigurationsdateien auf dem Client.

/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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage