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, é?