私は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オブジェクトにバイト文字列へ変換する
ありがとう、それは今私のutf-8フィールドをUnicode Python文字列に変換します。 – Faelenor
エラーメッセージによると、 "utf-8フィールド"の最初の非ASCIIバイトは '0xe9'です。これは、それが** UTF-8でエンコードされていないことを示しています。... 'cp1252'になる可能性はずっと高くなります。 –
@ JohnMachin - エンジンを作成するときに文字セットを指定しないと、mysqldbはlatin1にデフォルト設定されているようです。文字セットを設定すると、dbとクライアントの両方に正しい転送エンコーディングが使用され、問題が解決されます。 – mata