2012-08-15 13 views
9

Bu işleve, SQLAlchemy ve UnicodeDecodeError

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

alıyorum:

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

veritabanı kodlama utf olduğunu -8 ve hatta kodlamayı SQLAlchemy'nin create_engine işlevine geçiriyorum.

Düzenleme: Bu benim veritabanı sorgulama am nasıl: öneri olarak

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

, ben s.decode geçti ('utf-8') sub için. Hata yukarıda kayboldu, ama farklı bir belge için farklı bir hata alıyorum:

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

veritabanı tablosu şöyle tanımlanır:

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; 

Herhangi bir yardım olacağını büyük ölçüde

+0

Daha fazla kod görebilir miyiz? Nereden geliyor? Kodları ('utf8') 'düzeltmek mi? –

+0

@MartijnPieters, s.decode ('utf-8') ekleyerek söz konusu belgenin hatasını düzeltir, ancak veritabanından farklı bir belge almaya çalışırsam şunu alırım: UnicodeDecodeError: 'utf8' codec'i bayt 0xb'yi çözemez pozisyon 449: geçersiz devam bayt. Yani, aynı hata, farklı karakter. – user1491915

+0

Hayır, bu farklı bir hatadır (biri ascii'den, diğerinden utf-8'den bir kod çözme). Bu, ikinci belgenin tüm * UTF-8 veri * olmadığı anlamına gelir. İşte bu yüzden nereden geldiğini görmek istiyoruz. –

cevap

28

ben takdir sorunu çözdü. title sütun, str ve Unicode değil, SQLAlchemy tarafından döndürüldü. encoding='utf8''un create_engine'a bir argüman olarak eklenmesi gerektiğini düşündüm, ancak bunu yapmanın doğru yolu URI: mysql://[email protected]/mydatabase?charset=utf8 veritabanına iletmektir.

Tüm cevaplarınız için teşekkür ederiz!

+1

Bu bir cankurtaran oldu! :-) – JesperB

+3

Sadece "geçersiz bağlantı seçeneği" olsun "charset" '=/ –

+0

Yukarıdaki Ditto. Teşekkürler dostum. –