Skip site navigation (1) Skip section navigation (2)

Re: Conversion UTF8 - WIN1252 en campos binarios ?

From: Walter Negro <wnegro(at)vstour(dot)com>
To: alvherre <alvherre(at)commandprompt(dot)com>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Conversion UTF8 - WIN1252 en campos binarios ?
Date: 2010-05-28 12:00:09
Message-ID: 4BFFB049.2010005@vstour.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Álvaro,
Hice nuevas pruebas y decidí enviar el dato bytea configurado como binario.
Según la documentación, el parámetro paramLengths sólo es tomado en 
cuenta si el dato es enviado con formato binario.
Algunas veces la documentación puede no ser exactamente lo que ocurre 
internamente por muchas razones, así que me puse a mirar el código de la 
libpq y encontré que si el parámetro no es pasado como binario, la 
librería calcula el largo del string usando la función strlen(). Por lo 
tanto, la única forma de pasar correctamente un dato binario a un campo 
bytea, que pueda contener caracteres nulos, es pasarlo justamente como 
binario.

Hice la prueba y la grabación se realizó sin errores, pero luego procedí 
a recuperar los datos para verificar si se grabó correctamente.

Recuperé los datos y fueron exactamente iguales a lo grabado. Probé 
configurando el CLIENT_ENCODING en UTF8 y en WIN1252 y no tuve 
diferencias y esto lo hice porque el retorno de los datos está 
configurado para ser obtenido como texto.

Así que la conclusión que saco es que los datos bytea hay que pasarlos 
configurados binario porque si no, el servidor puede hacer conversiones, 
además de ser la única forma de pasar datos binarios que contengan 
caracteres nulos. Sin embargo al recuperar los datos no se hacen 
conversiones para los campos bytea, así que no hay problemas en esos casos.

La otra conclusión es que la documentación debería ser más clara 
respecto al manejo de los bytea en las funciones PQexecParams y similares.


Walter Negro


Walter Negro escribió:
> Álvaro,
> Ahora le pasé el OID al parámetro bytea. Según consulté en pg_type, el 
> oid de bytea es 17.
> Pero sigo obteniendo el mismo mensaje de error:
> ERROR:  carácter 0x81 de codificación «WIN1252» no tiene equivalente 
> en «UTF8»
>
> Agrego que el parámetro paramFormats de PQexecParams, es NULL, 
> indicando que todos los parámetros son texto.
> La solución no debería pasar por pasar el bytea en formato binario 
> (binario en el formato de almacenamiento del servidor), que incluso 
> creo que sólo está soportado para datos escalares.
>
> Walter Negro
>
> Walter Negro escribió:
>> Álvaro,
>> Justamente estoy casteando en la query para no usar OIDs, que es una 
>> recomendación de la documentación. Pero ahora mientras te contesto, 
>> entiendo donde podría estar el problema.
>> Hago unas pruebas pasando el OID y les cuento.
>>
>> Gracias
>>
>> Walter Negro
>
>
> -
> 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

pgsql-es-ayuda by date

Next:From: Walter NegroDate: 2010-05-28 12:08:10
Subject: Re: Conversion UTF8 - WIN1252 en campos binarios ?
Previous:From: Conxita MarínDate: 2010-05-28 10:54:06
Subject: Re: Conversion UTF8 - WIN1252 en campos binarios ?

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group