通过adodbapi对MS SQL的查询打印出来的UnicodeEncodeError打印结果

时间:2012-03-17 03:51:38

标签: python unicode adodbapi

Python新手在这里。

我在Windows7上使用python2.7.2。

我已经安装了PyWin32扩展(build 217)。

我在c:\Python27\Lib\site-packages\adodbapi

中安装了adopdbapi

我有一个非常简单的模块,用于查询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'

2 个答案:

答案 0 :(得分: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在评论中说。但这不一定是阻塞问题。通常,当从数据库查询中检索行时,人们不仅仅想要一行的字符串表示;他们想要检索各列中的值。我的结论是,由于我构建测试应用程序的方式,这个问题是一个人为的问题。

答案 1 :(得分:0)

  

我怎么能告诉它只使用UTF-8?

chcp 65001