Á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@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda




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

Responder a