1

SQLAlchemy を使用して MySQL テーブルと通信する Python 2 Pyramid Web アプリがあります。そのすべての文字列列はUTF-8でエンコードされています。表示するデータをプルするときは.decode("UTF-8")、それを表示するために使用する必要があります。そうしないと、ASCII がデコードできないという自然なエラーが発生します。

2 つの質問があります。

  1. .decode("UTF-8")毎回の必要性を避けるために、他に作業する方法はありますか?

  2. データベースに何かをプッシュしたい場合、文字列が であるs = u'str'場合、UTF-8 列に挿入するときに何かする必要がありますか?

どうもありがとうございました。

Google 検索でこのメッセージを見つけた場合: エラーが発生した場合は、次のようにします。

UnicodeDecodeError: 'ascii' コーデックはバイトをデコードできません

使用する.encode(..)

4

1 に答える 1

3

SQLAlchemy列がStringではなくUnicodeタイプの場合、SQLAlchemyは文字エンコード/デコード(この場合はto / from )を実行します。UTF-8

文字列列タイプにはconvert_unicodeに設定できるパラメータがありますがTrue、これはデータベースバックエンドがネイティブUnicodeをサポートしていない非常にまれなケースにのみ使用する必要があることに注意してください。

@MartijnPietersが彼のコメントで述べたように、SQLAlchemyドキュメントのMySQLUnicodeセクションに注意する必要があります。つまり、データベースへの接続で文字エンコードを明示的に設定しない場合は、次のようにします。

# set client encoding to utf8; all strings come back as unicode
create_engine('mysql+mysqldb:///mydb?charset=utf8')

(以下は主にSQLAlchemyのドキュメントから引用されています)

"[...]多くのMySQLサーバーのインストールでは、デフォルトでクライアント接続のエンコードが使用されます。これにより、テーブルと列にまたは別の文字セットが構成されている場合でも、latin1すべてのデータがに変換されます。 MySQL-Pythonには、有効にするという副作用もあります。」latin1utf8use_unicode=1

「手動で設定use_unicode=0すると、MySQL-pythonはエンコードされた文字列を返します:」

# set client encoding to utf8; all strings come back as utf8 str
create_engine('mysql+mysqldb:///mydb?charset=utf8&use_unicode=0')
于 2012-10-12T13:10:57.347 に答える