23

SQLAlchemy エンジンで次のように実行する SQL クエリがあります。

result = engine.execute('SELECT utf_8_field FROM table')

データベースは MySQL で、列の型は UTF-8 エンコーディングの TEXT です。エンジンの作成時にオプション convert_unicode=True を設定しても、返される utf_8_field のタイプは「str」です。文字列に 'é' のような文字 (7 ビット ASCII ではなく、拡張 ASCII セット) がある場合、これを実行しようとすると UnicodeDecodeError が発生します。

utf_8_field.encode("utf-8")

正確なエラーは次のとおりです。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 1: ordinal not in range(128)

これを調べたところ、str.encode が拡張 ASCII 文字セットをサポートしていないことがわかりました。これは本当に奇妙だと思いますが、それは別の質問です。

私が理解していないのは、SQLAlchemy がユニコード文字列を与えない理由です。以前は DB-API を使用していましたが、問題なく動作していました。テーブル用の SQLAlchemy テーブル オブジェクトもまだ持っていません。そのため、実行コマンドを使用しています。

何か案が?

4

2 に答える 2

48

データを自動的に変換する場合は、エンジンを作成するときに文字セットを指定する必要があります。

create_engine('mysql+mysqldb:///mydb?charset=utf8')

設定use_unicodeだけでは、使用する文字セットが sqlalchemy に通知されません。

于 2012-05-30T15:24:24.707 に答える
3

UTF-8 バイト文字列から Unicode オブジェクトに変換するには、次をデコードする必要があります。

utf_8_field.decode('utf8')

また、生のSELECTthrough を実行する場合.execute、SQLAlchemy には、クエリが utf-8 データを返していることを確認するためのメタデータがないため、この情報を Unicode に変換していません。

つまり、convert_unicodeSQLAlchemy SQL 式 API または ORM 機能を使用する場合にのみ機能します。

編集: 指摘したように、データは UTF-8 でエンコードされていません。0xe9in UTF-8 は と の間の文字を示します\u9000\u9fffこれは CJK 統一表意文字ですが、UTF-8 コードが で始まる latin-1 文字であると言っていました0xc3。これはおそらくISO-8859-1(latin-1) または同様のものです。

>>> u'é'.encode('ISO-8859-1')
'\xe9'

charset=utf8結論は、@mata で指摘されているように、パラメーターを使用して、SQLAlchemy に別の文字セットに接続するように指示することです。

于 2012-05-30T15:18:55.400 に答える