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 ([email protected]) Para cambiar tu suscripción: http://www.postgresql.org/mailpref/pgsql-es-ayuda
