3

Python初心者はこちら。

Windows7でpython2.7.2を使用しています。

PyWin32 拡張機能 (ビルド 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」を与えます

4

2 に答える 2

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

したがって、Borealid がコメントで述べたように、問題は実際にはstradodbapi 内での使用です。しかし、それは必ずしもブロッキングの問題ではありません。通常、データベース クエリから行を取得する場合、単に行の文字列表現が必要なわけではありません。個々の列の値を取得したいと考えています。私の結論は、この問題は、私がテスト アプリを作成した方法に起因する、一種の人為的な問題であるということです。

于 2012-03-17T17:33:37.513 に答える
0

UTF-8だけを使用するようにするにはどうすればよいですか?

chcp 65001
于 2012-03-17T04:43:55.850 に答える