2012-08-15 6 views
9

DostajęSQLAlchemy i UnicodeDecodeError

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

kiedy mijam tekst pochodzących z bazy danych MySQL, który I 'm dostęp przy użyciu SQLAlchemy, do tej funkcji:

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

Kodowanie bazy danych jest utf -8 i nawet przekazuję kodowanie do funkcji create_engine w SQLAlchemy.

Edit: To jak ja zapytań do bazy danych:

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

sugestia, zdałem s.decode ('utf-8') do sub. Błąd powyżej zniknął, ale pojawia się inny błąd dla innego dokumentu:

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

tabela bazy danych jest zdefiniowany następująco:

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; 

Każda pomoc będzie bardzo mile widziane

+0

Czy możemy zobaczyć więcej kodu? Skąd się wzięło 's'? Czy 's.decode ('utf8')' naprawi? –

+0

@MartijnPieters dodając s.decode ('utf-8') naprawia błąd dla tego konkretnego dokumentu, ale jeśli próbuję uzyskać inny dokument z bazy danych, otrzymam: UnicodeDecodeError: kodek 'utf8' nie może dekodować bajtu 0xeb w pozycja 449: niepoprawny bajt kontynuacji. Więc ten sam błąd, inna postać. – user1491915

+0

Nie, to inny błąd (jeden dekoduje z ascii, drugi z utf-8). Oznacza to, że drugi dokument w ogóle nie jest danymi UTF-8 *. Właśnie dlatego chcemy zobaczyć skąd pochodzi "s". –

Odpowiedz

28

mam rozwiązał problem. Kolumna title była zwracana przez SQLAlchemy jako str, a nie Unicode. Myślałem, że dodanie encoding='utf8' jako argumentu do create_engine zajmie się tym, jednak właściwym sposobem na to jest przekazanie go w bazie danych URI: mysql://[email protected]/mydatabase?charset=utf8.

Dziękuję za wszystkie odpowiedzi!

+1

To był ratownik! :-) – JesperB

+3

Po prostu pojawia się zestaw znaków "nieprawidłowy zestaw połączeń" '' =/ –

+0

Podobnie jak wyżej. Dzięki. –