2012-03-17 59 views
3

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'

+0

我沒有你的答案,但+1只是爲了這個名字。 :) – 2012-03-17 03:53:17

+0

如果adodbapi沒有此功能切換,您將不得不編輯/猴子修補它。錯誤在於堆棧跟蹤顯示,在adodbapi.py的第651行,他們試圖調用一個Unicode字符串的'str'... – Borealid 2012-03-17 03:55:17

+0

@Borealid - 我想這可能是因爲我正在運行python腳本從'cmd.exe'窗口中。這可能不是unicode能力。 – Cheeso 2012-03-17 03:57:51

回答

1

我能拿到劇本完成運行,打印所有檢索到的行,通過修改輸出部分要做到這一點:

# 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 

所以這個問題實際上是在adodbapi中使用str,正如Borealid在評論中所說。但這並不一定是阻塞問題。通常,當從數據庫查詢中檢索行時,人們不僅僅需要一行的字符串表示;他們想要檢索單個列中的值。我的結論是,由於我構建測試應用程序的方式,這個問題是一個人爲問題。

0

我怎麼能告訴它只是使用UTF-8?

chcp 65001