usando pyodbc no linux para inserir caracteres unicode ou utf-8 em um campo nvarchar mss

Estou usandoUbuntu 9.04

Instalei as seguintes versões do pacote:

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

Eu configurei/etc/unixodbc.ini como isso

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

Eu configurei/etc/freetds/freetds.conf como isso

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

Eu peguei revisão pyodbc31e2fae4adbf1b2af1726e5668a3414cf46b454f a partir dehttp://github.com/mkleehammer/pyodbc e instalei usando "python setup.py install"

Eu tenho uma máquina Windows comMicrosoft SQL Server 2000 instalado na minha rede local, ativo e escutando o endereço IP local 10.32.42.69. Eu tenho um banco de dados vazio criado com o nome "Comum". Eu tenho o usuário "sa" com a senha "secreta" com privilégios completos.

Estou usando o seguinte código python para configurar a conexão:

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()

EverythingTRABALH até este ponto. Eu usei o Enterprise Manager do SQLServer no servidor e a nova tabela está lá. Agora eu quero inserir alguns dados na tabela.

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

Isso falha !! Aqui está o erro que recebo:

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

Desde que meu cliente está configurado para usar UTF-8, pensei que poderia resolver codificando dados em UTF-8. Isso funciona, mas então eu recebo dados estranhos:

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]

Isso não dá erro, mas os dados retornados não são os mesmos dados enviados! Eu recebo

<type 'unicode'> somé string

Isto é, o pyodbc não aceita diretamente um objeto unicode, mas retorna objetos unicode de volta para mim! E a codificação está sendo misturada!

Agora, para a pergunta:

Eu quero que o código insira dados unicode em um campo NVARCHAR e / ou NTEXT. Ao consultar novamente, quero os mesmos dados que inseri.

Isso pode ser feito configurando o sistema de maneira diferente ou usando uma função de wrapper capaz de converter os dados corretamente de / para unicode ao inserir ou recuperar

Isso não é pedir muito, é?

questionAnswers(8)

yourAnswerToTheQuestion