Python新手在這裏。Ye olde UnicodeEncodeError從MS SQL查詢打印結果與adodbapi
我在Windows7上使用python2.7.2。
我已經安裝了PyWin32擴展(build 217)。
我已經adopdbapi安裝在c:\Python27\Lib\site-packages\adodbapi
我有一個非常簡單的模塊,查詢在MS SQL Server中的AdventureWorks2008LT數據庫。
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:我在Windows中運行cmd.exe提示符下的腳本。這是否意味着stdout始終是ASCII?
如\python27\python.exe -c "import sys; print(sys.stdout.encoding)"
給我 'CP437'
我沒有你的答案,但+1只是爲了這個名字。 :) – 2012-03-17 03:53:17
如果adodbapi沒有此功能切換,您將不得不編輯/猴子修補它。錯誤在於堆棧跟蹤顯示,在adodbapi.py的第651行,他們試圖調用一個Unicode字符串的'str'... – Borealid 2012-03-17 03:55:17
@Borealid - 我想這可能是因爲我正在運行python腳本從'cmd.exe'窗口中。這可能不是unicode能力。 – Cheeso 2012-03-17 03:57:51