Re: duda sobre codificación

From: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>
To: "Guillermo E(dot) Villanueva" <guillermovil(at)gmail(dot)com>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: duda sobre codificación
Date: 2013-04-19 19:16:31
Message-ID: 20130419191631.GO2246@eldon.alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Guillermo E. Villanueva escribió:
> Amigos, heredé una base de datos que está codificada en LATIN1
> Intenté hacer backup de algunas tablas para llevarlas de un server a otro.
> En ambos casos está en LATIN1
> Al backup lo hice generando INSERTs
> El mismo backup ya me genera el archivo con seteos preliminares como :
> SET client_encoding = 'LATIN1';
> Y la sorpresa viene cuando ejecuto los inserts (lo hago desde pgAdmin)
> guarda mal los caracteres especiales como ñ á é etc
> en cambio si modifico el seteo pasándolo a :
> SET client_encoding = 'UTF8';
> Todo se guarda ok
>
> Porqueeee si la base está en LATIN1 y el cliente estaba en LATIN1, no se
> suponía que debía guardar bien así?
> Desde ya les agradezco si me pueden aclarar un poquito el panorama

Seguramente lo que sucede es que los datos realmente no están en Latin1
porque las aplicaciones han estado hablando en UTF8 todo el tiempo. Si
hubieras declarado client_encoding=utf8 el sistema habría hecho
conversión de los bytes que llegaban de la aplicación y los habría
ingresado en Latin1. Pero no lo hiciste; y Latin1 no tiene mecanismo de
auto-verificación, de manera que los bytes que recibe son los que
inserta, sin posibilidad de verificar que "tienen sentido".

UTF8 es distinto no sólo porque los caracteres se representan diferente,
sino también tiene más redundancia en la representación de los
caracteres, de manera que si tratas de insertar datos que en realidad
están en Latin1 (por ejemplo), puede darse cuenta que a la secuencia le
faltan bytes y rechaza la cadena como no válida.

Tu solución es tratar de importar los datos en UTF8 y verificar que todo
está correcto. Si hay algo que falla la inserción, considera esos datos
restantes como si estuvieran en Latin1 (client_encoding=latin1). Luego
de eso deberías tener todos los datos con la codificación correcta.
A mí me tocó enfrentar este mismo problema, donde había una mezcla de
UTF8 válido (99% de los datos) y Latin1. Lo que hice fue pasar todo por
pgloader en dos pasadas; la primera asumía encoding utf8. El 1% fue
rechazado y agregado a un archivo de fallas; la segunda pasada importaba
el archivo de fallas considerando latin1.

--
Álvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Guillermo E. Villanueva 2013-04-19 20:50:35 Re: [pgsql-es-ayuda] duda sobre codificación
Previous Message Alvaro Herrera 2013-04-19 14:52:36 Re: Aviso automático de conexión caida.