2012-05-30 6 views
18

私はSQLAlchemyのエンジンでこのように実行するSQLクエリを持っている:UTF-8カラムのSQLAlchemy結果は 'str'タイプです。なぜですか?

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テーブルオブジェクトを持っていないので、私は実行コマンドを使用している。

UTF-8 Unicodeオブジェクトにバイト文字列へ変換する

答えて

33

、あなたはエンジンを作成specify the charset必要がある場合:

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

のみuse_unicodeを設定するにはSQLAlchemyのどの文字セットを使用することを教えてくれません。

+0

ありがとう、それは今私のutf-8フィールドをUnicode Python文字列に変換します。 – Faelenor

+1

エラーメッセージによると、 "utf-8フィールド"の最初の非ASCIIバイトは '0xe9'です。これは、それが** UTF-8でエンコードされていないことを示しています。... 'cp1252'になる可能性はずっと高くなります。 –

+0

@ JohnMachin - エンジンを作成するときに文字セットを指定しないと、mysqldbはlatin1にデフォルト設定されているようです。文字セットを設定すると、dbとクライアントの両方に正しい転送エンコーディングが使用され、問題が解決されます。 – mata

2

、あなたがデコードする必要があります。.executeを通じて生SELECTを実行する際に

utf_8_field.decode('utf8') 

また、SQLAlchemyのは、あなたのことを仕事に何のメタデータを持っていませんクエリはutf-8データを返すため、この情報をUnicodeに変換しません。

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

EDIT:あなたのデータはUTF-8でエンコードされていません。 UTF-8の0xe9は、と\u9fffの間の文字を示します。これは、UTF-8コードが0xc3で始まるラテン1文字であると言いながら、CJKの統一された表意文字です。これはおそらくISO-8859-1(ラテン1)または同様の代わりに、次のとおりです。

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

結論は、その後@mataで指摘したように、charset=utf8パラメータを使用して、別の文字セットを使用して接続するためのSQLAlchemyのを伝えることです。あなたは、データが自動的に変換したい場合

+0

DB-APIを使用しているときは、前にencode( 'utf-8')行がありました。私はデータベースがユニコードに変換された文字列を返したので、それがutf-8に戻ってほしいと思ったのです。 – Faelenor

+0

-1彼はUTF-8でエンコードされたデータを持っていません。彼のエラーメッセージを読んでください。 –

+0

@JohnMachin:彼のエラーメッセージは、バイトコード(ASCII)を最初にデコードするために使用されるデフォルトのコーデックはUTF-8を扱うことができないと述べています。 –

関連する問題