Я использую Ubuntu 9.04
Я установил следующие версии пакетов:
unixodbc and unixodbc-dev: 2.2.11-16build3
tdsodbc: 0.82-4
libsybdb5: 0.82-4
freetds-common and freetds-dev: 0.82-4
Я настроил /etc/unixodbc.ini
следующим образом:
[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/odbc/libtdsodbc.so
Setup = /usr/lib/odbc/libtdsS.so
CPTimeout =
CPReuse =
UsageCount = 2
Я настроил /etc/freetds/freetds.conf
следующим образом:
[global]
tds version = 8.0
client charset = UTF-8
Я взял ревизию podbc 31e2fae4adbf1b2af1726e5668a3414cf46b454f
из http://github.com/mkleehammer/pyodbc
и установил ее, используя "python setup.py install
"
У меня есть Windows-машина с Microsoft SQL Server 2000, установленная в моей локальной сети, вверх и прослушивание локального IP-адреса 10.32.42.69. У меня есть пустая база данных, созданная с именем "Common". У меня есть пользователь "sa" с паролем "секретный" с полными привилегиями.
Я использую следующий код python для настройки соединения:
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()
Все РАБОТЫ до этой точки. Я использовал SQLServer Enterprise Manager на сервере, и там есть новая таблица. Теперь я хочу вставить некоторые данные в таблицу.
cur = con.cursor()
cur.execute('INSERT INTO testing (name) VALUES (?)', (u'something',))
Это не удастся! Вот ошибка, которую я получаю:
pyodbc.Error: ('HY004', '[HY004] [FreeTDS][SQL Server]Invalid data type
(0) (SQLBindParameter)'
Поскольку мой клиент настроен на использование UTF-8, я думал, что могу решить, кодируя данные в UTF-8. Это работает, но потом я возвращаю странные данные:
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]
Это не дает ошибок, но возвращенные данные - это не те же данные, которые были отправлены! Я получаю:
<type 'unicode'> somé string
То есть, pyodbc не принимает объект unicode напрямую, но возвращает объекты unicode обратно ко мне! И кодировка смешивается!
Теперь на вопрос:
Я хочу, чтобы код вставлял данные Unicode в поле NVARCHAR и/или NTEXT. Когда я возвращаю запрос, я хочу, чтобы те же данные, которые я вставлял обратно.
Это может быть путем настройки системы по-разному или с помощью функции-обертки, способной правильно преобразовывать данные в/из юникода при вставке или извлечении
Что не спрашивает много, не так ли?