Вы печатаете результаты UnicodeEncodeError из запроса на MS SQL с помощью adodbapi
Питон новичок здесь.
Я использую python2.7.2 на Windows7.
Я установил расширения PyWin32 (сборка 217).
Я установил c:\Python27\Lib\site-packages\adodbapi
У меня есть очень простой модуль, который запрашивает базу данных AdventureWorks2008LT в MS SQL Server.
import adodbapi
connStr='Provider=SQLOLEDB.1;' \
'Integrated Security=SSPI;' \
'Persist Security Info=False;' \
'Initial Catalog=AVWKS2008LT;' \
'Data Source=.\\SQLEXPRESS'
conn = adodbapi.connect(connStr)
tablename = "[salesLT].[Customer]"
# create a cursor
cur = conn.cursor()
# extract all the data
sql = "select * from %s" % tablename
cur.execute(sql)
# show the result
result = cur.fetchall()
for item in result:
print item
# close the cursor and connection
cur.close()
conn.close()
Образец базы данных AdventureWorks2008LT содержит таблицы клиентов, продуктов, адресов и заказов (и т. Д.). Некоторые из строковых данных в этих таблицах являются Unicode.
Запрос работает, для первых двух строк. Я вижу ожидаемый результат. Но затем скрипт завершается с этим сообщением:
Traceback (most recent call last):
File "C:\dev\python\query-1.py", line 24, in <module>
print item
File "C:\Python27\lib\site-packages\adodbapi\adodbapi.py", line 651, in __str__
return str(tuple([str(self._getValue(i)) for i in range(len(self.rows.converters))]))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 19: ordinal not in range(128)
... что очень не полезно. Мне.
Я понял, что adodbapi пытается закодировать символ u'\xe9' в ASCII. Я понимаю, почему это не удастся. Я полагаю, он пытается сделать это как часть print
заявление.
Почему он пытается закодировать символ в ASCII?
Как я могу сказать это просто использовать UTF-8?
PS: я запускаю скрипт из командной строки cmd.exe в Windows. Означает ли это, что стандартный вывод всегда ASCII?
например, \python27\python.exe -c "import sys; print(sys.stdout.encoding)"
дает мне "cp437"
2 ответа
Я смог заставить скрипт работать до конца, печатая все извлеченные строки, изменив часть вывода, чтобы сделать это:
# show the result
result = cur.fetchall()
for item in result:
print repr(item)
вместо этого:
# show the result
result = cur.fetchall()
for item in result:
print item
Так что проблема на самом деле заключается в использовании str
в адодбапи, как сказал Бореалид в комментарии. Но это не обязательно проблема блокировки. Обычно при извлечении строк из запроса к базе данных люди не просто хотят получить строковое представление строки; они хотят получить значения в отдельных столбцах. Я пришел к выводу, что эта проблема является своего рода искусственной проблемой, из-за того, как я создавал тестовое приложение.