2012-08-15 33 views
9

我越來越SQLAlchemy的和的UnicodeDecodeError

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

當我通過文字從一個MySQL數據庫,我使用的SQLAlchemy訪問的到來,給這個函數:

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')'會修復一些事情嗎? – 2012-08-15 15:35:05

+0

@MartijnPieters添加s.decode('utf-8')修復了該特定文檔的錯誤,但是如果我嘗試從數據庫中獲取不同的文檔,則會得到:UnicodeDecodeError:'utf8'編解碼器無法解碼字節0xeb位置449:無效的連續字節。所以,同樣的錯誤,不同的性格。 – user1491915 2012-08-15 15:41:33

+0

不,這是一個不同的錯誤(一個解碼來自ascii,另一個來自utf-8)。這意味着第二個文檔根本不是UTF-8數據*。這就是爲什麼我們想看看's'從哪裏來的原因。 – 2012-08-15 15:42:31

回答

28

我有解決了這個問題。 SQLAlchemy將title列作爲str返回,而不是Unicode。 我認爲將encoding='utf8'作爲參數create_engine會處理此問題,但是,正確的方法是將其傳遞到數據庫URI中:mysql://[email protected]/mydatabase?charset=utf8

謝謝你的答案!

+1

這是一個救星! :-) – JesperB 2013-02-10 00:08:50

+3

我剛剛得到'無效連接選項'字符集「'=/ – 2014-04-10 13:59:39

+0

同上。謝啦。 – 2014-07-25 19:37:04