Форум сайта python.su
Добрый день
В одном из моих проектов требуется записывать в MSSQL строки на русском языке. После смены версии библиотеки pymssql на свежую столкнулся с изменением ее поведения, с которым не смог справиться самостоятельно. Покажу на тестовом примере (такая схема работала на старой версии pymssql и вполне устраивала)
(Среда выполнения: Windows, Python 2.7, pymssql 2.0.0b, MSSQL2005, Collation - Cyrillic General CI AS):
# -*- coding: cp1251 -*- import pymssql con = pymssql.connect(host='127.1.1.1',user='sa',password='pass', database='reports', charset='cp1251') cur = con.cursor() sql = u"insert into users (FirstName,LastName,Job) values ('Вася', 'Пупкин', 'Пользователь')" print sql, isinstance(sql, unicode) # Исходный запрос sql = sql.encode('cp1251') print sql, isinstance(sql, unicode) # Запрос в кодировке БД cur.execute(sql) con.commit() cur.execute('SELECT * FROM users') for row in cur: print row[0], row[1], row[2] con.close()
insert into users (FirstName,LastName,Job) values ('Вася', ‘Пупкин’, ‘Пользователь’) TrueПосле некоторой медитации с доками и исходным кодом библиотеки, решил что кодировку БД достаточно указать один раз в начале, а дополнительное преобразование sql = sql.encode('cp1251') уже не нужно и является старым костылем. Но стало только хуже:
insert into users (FirstName,LastName,Job) values ('Вася', ‘Пупкин’, ‘Пользователь’) False
…
49 Павел Иванов # Нормальные значения, внесенные старой версией
…
55 Aany Ioieei # Значения в неверной кодировке, внесенные новой версией
insert into users (FirstName,LastName,Job) values ('Вася', ‘Пупкин’, ‘Пользователь’) TrueПодскажите, что я делаю не так? Как затолкать в MSSQL простые текстовые данные?
insert into users (FirstName,LastName,Job) values ('Вася', ‘Пупкин’, ‘Пользователь’) True
Traceback (most recent call last):
File “D:\Projects\Губкинский ГПК - НТК2 - Тренажер\tools\chek_mssql.py”, line 26, in <module>
cur.execute(sql) #, params)
File “pymssql.pyx”, line 380, in pymssql.Cursor.execute (pymssql.c:4790)
self._source._conn.execute_query(operation)
File “_mssql.pyx”, line 787, in _mssql.MSSQLConnection.execute_query (_mssql.c:8225)
cpdef execute_query(self, query_string, params=None):
File “_mssql.pyx”, line 818, in _mssql.MSSQLConnection.execute_query (_mssql.c:8107)
self.format_and_run_query(query_string, params)
File “_mssql.pyx”, line 951, in _mssql.MSSQLConnection.format_and_run_query (_mssql.c:9302)
log(query_string)
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 52-55: ordinal not in range(128)
Офлайн