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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

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