à l'aide de pyodbc sur linux pour insérer unicode ou utf-8, les caractères d'un type nvarchar mssql champ

Je suis en utilisant Ubuntu 9.04

J'ai installé le package suivant les versions:

unixodbc and unixodbc-dev: 2.2.11-16build3
tdsodbc: 0.82-4
libsybdb5: 0.82-4
freetds-common and freetds-dev: 0.82-4

J'ai configuré /etc/unixodbc.ini comme ceci:

[FreeTDS]
Description             = TDS driver (Sybase/MS SQL)
Driver          = /usr/lib/odbc/libtdsodbc.so
Setup           = /usr/lib/odbc/libtdsS.so
CPTimeout               = 
CPReuse         = 
UsageCount              = 2

J'ai configuré /etc/freetds/freetds.conf comme ceci:

[global]
    tds version = 8.0
    client charset = UTF-8

J'ai attrapé pyodbc révision 31e2fae4adbf1b2af1726e5668a3414cf46b454f de http://github.com/mkleehammer/pyodbc et installé à l'aide de "python setup.py install"

J'ai une machine windows avec Microsoft SQL Server 2000 installé sur mon réseau local, et l'écoute sur l'adresse ip locale 10.32.42.69. J'ai une base de données vide créé avec le nom "Commun". J'ai de l'utilisateur "sa" mot de passe "secret" avec plein de privilèges.

Je suis en utilisant le code python suivant la configuration de la connexion:

import pyodbc
odbcstring = "SERVER=10.32.42.69;UID=sa;PWD=secret;DATABASE=Common;DRIVER=FreeTDS"
con = pyodbc.connect(s)
cur = con.cursor()
cur.execute('''
CREATE TABLE testing (
    id INTEGER NOT NULL IDENTITY(1,1), 
    name NVARCHAR(200) NULL, 
    PRIMARY KEY (id)
)
    ''')
con.commit()

Tout ŒUVRES jusqu'à ce point. J'ai utilisé sql server Enterprise Manager sur le serveur et la nouvelle table est là.
Maintenant, je veux insérer des données sur la table.

cur = con.cursor()
cur.execute('INSERT INTO testing (name) VALUES (?)', (u'something',))

Qui tombe en panne!! Voici l'erreur que je reçois:

pyodbc.Error: ('HY004', '[HY004] [FreeTDS][SQL Server]Invalid data type 
(0) (SQLBindParameter)'

Depuis mon client est configuré pour utiliser l'UTF-8, j'ai pensé que je pourrais résoudre par le codage des données en UTF-8. Ce qui fonctionne, mais, ensuite, je reviens étrange de données:

cur = con.cursor()
cur.execute('DELETE FROM testing')
cur.execute('INSERT INTO testing (name) VALUES (?)', (u'somé string'.encode('utf-8'),))
con.commit()
# fetching data back
cur = con.cursor()
cur.execute('SELECT name FROM testing')
data = cur.fetchone()
print type(data[0]), data[0]

Qui ne donne pas d'erreur, mais les données retournées ne sont pas les mêmes données envoyées! J'obtiens:

<type 'unicode'> somé string

Qui est, pyodbc de ne pas accepter une unicode objet directement, mais il renvoie unicode objets de dos pour moi! Et l'encodage est mélangé!

Maintenant, pour la question:

Je veux le code pour insérer des données unicode dans un NVARCHAR et/ou NTEXT champ. Quand j'ai une requête en arrière, je veux les mêmes données que j'ai inséré.

Qui peuvent être en configurant le système différemment, ou par l'utilisation d'une fonction wrapper capable de convertir correctement les données de/vers l'unicode lors de l'insertion ou de la récupération de

Qui ne demande pas beaucoup, est-il?

InformationsquelleAutor nosklo | 2009-06-03