2012-08-15 18 views
9

Estoy consiguiendoSQLAlchemy y UnicodeDecodeError

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

cuando paso de texto procedente de una base de datos MySQL, que yo soy el acceso utilizando SQLAlchemy, a esta función:

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

La codificación de la base de datos es UTF -8 e incluso estoy pasando la codificación a la función create_engine de SQLAlchemy.

Editar: Así es como yo estoy consultando la base de datos:

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

Por sugerencia, pasé s.decode ('UTF-8') a sub. El error anterior desapareció, pero me da un error diferente para un documento diferente:

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

la tabla de base de datos se define así:

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; 

Cualquier ayuda sería muy apreciada

+0

¿Podemos ver un código más? ¿De dónde viene 's'? Would 's.decode ('utf8')' arreglar cosas? –

+0

@MartijnPieters al agregar s.decode ('utf-8') corrige el error para ese documento en particular, pero si trato de obtener un documento diferente de la base de datos obtengo: UnicodeDecodeError: el códec 'utf8' no puede decodificar byte 0xeb posición 449: byte de continuación inválido. Entonces, el mismo error, diferente personaje. – user1491915

+0

No, ese es un error diferente (una decodifica desde ascii, la otra desde utf-8). Eso significa que el segundo documento no es UTF-8 data * en absoluto *. Por eso queremos ver de dónde viene 's'. –

Respuesta

28

tengo resuelto el problema La columna title estaba siendo devuelta por SQLAlchemy como str y no Unicode. Pensé que agregar encoding='utf8' como argumento al create_engine se encargaría de esto, sin embargo, la manera correcta de hacerlo es pasarlo en el URI de la base de datos: mysql://[email protected]/mydatabase?charset=utf8.

¡Gracias por todas sus respuestas!

+1

¡Esto fue un salvavidas! :-) – JesperB

+3

Acabo de obtener la 'opción de conexión no válida" juego de caracteres '=/ –

+0

Lo mismo que en el caso anterior. Gracias hombre. –