Re: almacenamiento de binarios

From: Gunnar Wolf <gwolf(at)gwolf(dot)org>
To: Leonel Nunez <lnunez(at)enelserver(dot)com>
Cc: Jaime Casanova <systemguards(at)yahoo(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org, mario_soto(at)venezolanadeavaluos(dot)com
Subject: Re: almacenamiento de binarios
Date: 2004-12-28 02:54:25
Message-ID: 20041228025425.GG3584@gwolf.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Leonel Nunez dijo [Mon, Dec 27, 2004 at 01:58:37PM -0700]:
> >>Yo utilizo tipo lo para almacenar imagenes, es mucho
> >>más rápido y más
> >>eficiente para almacenar por ejemplo imagenes, una
> >>de las ventajas que le
> >>he encontrado a diferencia de utilizar base64 es que
> >>no importa el tamaño
> >>de la imagen es muy rapido extraerlas.
> >
> >Pero no puedes usar eso usando el odbc, o si? Si
> >puedes seria interesante ver como funciona, yo
> >sinceramente nunca lo logre.
>
> habria que buscar una funcion en el lenguaje que estas usando que
> convierta el archivo a base64
>
> en mi caso lo hago con perl

No conozco ODBC, uso también Perl... Ahí te va un tip que estaba un
poquito escondido, y me dio muchísimo gusto encontrar:

PostgreSQL maneja el tipo de datos BYTEA, para contenido binario de
longitud variable (esto es, equivalente a TEXT pero aceptando
cualquier tipo de archivos). Ahora, para que le mandes los datos a
Postgres, la documentación dice que debes escapar cada uno de los
caracteres no imprimibles, substituyéndolo por \xyz (la representación
octal). Esto en Perl se hace con una funcioncita muy simple (para el
programador), pero _muy_ complicada (para la máquina), más que nada si
estás hablando de archivos grandes.

En el manual de DBD::Pg menciona, sin embargo, que puedes brincarte
ese paso si le explicas al driver qué tipo de datos vas a mandar en
cada columna:

NOTE: The undocumented (and invalid) support for the "SQL_BINARY"
data type is officially deprecated. Use "PG_BYTEA" with
"bind_param()" instead:

$rv = $sth->bind_param($param_num, $bind_value,
{ pg_type => DBD::Pg::PG_BYTEA });

Va un ejemplo de mi código:

$sth = $file->{-db}->prepare('INSERT INTO prop_material (proposal_id,
filename, descr, data) VALUES (?, ?, ?, ?)');
$sth->bind_param(1, $file->{-proposal_id});
$sth->bind_param(2, $file->{-filename});
$sth->bind_param(3, $file->{-descr});
$sth->bind_param(4, $file->{-data},
{pg_type => DBD::Pg::PG_BYTEA });
$sth->execute;

Esto es, vas llenando los placeholders, al último le especificas el
tipo de datos que vas a mandar (para esto tienes que haber dado un
"use DBD::Pg"), y ejecutas sin argumentos.

Saludos,

--
Gunnar Wolf - gwolf(at)gwolf(dot)org - (+52-55)1451-2244 / 5554-9450
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Gunnar Wolf 2004-12-28 02:57:08 Re: almacenamiento de binarios
Previous Message Alvaro Herrera 2004-12-27 22:37:14 Re: Postgres & MSSQL