2012-08-15 11 views
9

私はテキストは、この関数に、私はSQLAlchemyのを使用してアクセスしていますが、MySQLデータベースから来る通過したときに、私はSQLAlchemyのとUnicodeDecodeError

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

を取得しています:

re.compile(ur"<([^>]+)>", flags=re.UNICODE).sub(u" ", s) 

データベースのエンコーディングがUTFあります-8、私はSQLAlchemyのcreate_engine関数にエンコーディングを渡しています。

編集: これは私がデータベースを照会しています方法です:提案することで

doc = session.query(Document).get(doc_id) 
s = doc.title 

が、私はs.decodeを通過した( 'UTF-8')subへ。消え上記のエラーが、私は別のドキュメントのために別のエラーを取得:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xeb in position 449: invalid continuation byte 

データベーステーブルはこのように定義されています

CREATE TABLE `articles` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) DEFAULT NULL, 
    `cdate` datetime DEFAULT NULL, 
    `link` varchar(255) DEFAULT NULL, 
    `content` text, 
    UNIQUE KEY `id` (`id`), 
    UNIQUE KEY `link_idx` (`link`) 
) ENGINE=InnoDB AUTO_INCREMENT=4127834 DEFAULT CHARSET=utf8; 

すべてのヘルプは大幅に私が持っている

+0

さらにコードを表示できますか? 's'はどこから来たの? 's.decode( 'utf8')'が修正するだろうか? –

+0

@MartijnPieters s.decode( 'utf-8')を追加すると、特定のドキュメントのエラーが修正されますが、データベースから別のドキュメントを取得しようとすると、UnicodeDecodeError: 'utf8'コーデックで0xebのバイトをデコードできませんポジション449:無効な継続バイト。だから、同じエラー、別の文字。 – user1491915

+0

いいえ、それは別のエラーです(1つはasciiから、もう1つはutf-8からデコードされます)。つまり、2番目のドキュメントはUTF-8データ*ではありません。だから私たちは 's'がどこから来たのかを知りたいのです。 –

答えて

28

をいただければ幸いです問題を解決しました。 title列はUnicodeではなくstrとしてSQLAlchemyから返されました。 私はcreate_engineへの引数としてencoding='utf8'を追加すると考えていましたが、正しい方法はデータベースURI:mysql://[email protected]/mydatabase?charset=utf8に渡すことです。

ありがとうございました!

+1

これは命を救いました! :-) – JesperB

+3

私はちょうど '無効な接続オプション" charset "' =/ –

+0

上記と同じです。ありがとう。 –

関連する問題