From: | "Ben-Nes Michael" <miki(at)canaan(dot)co(dot)il> |
---|---|
To: | "Joe Conway" <joseph(dot)conway(at)home(dot)com>, <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: store in bytea |
Date: | 2001-08-24 06:22:56 |
Message-ID: | 009c01c12c65$371ab220$aa5796d4@canaan.co.il |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
It sure is :)
On the theoretical issue, can I use TEXT field to store binary ?
If so, what will be the case with addslashes ? will it work ?
----- Original Message -----
From: "Joe Conway" <joseph(dot)conway(at)home(dot)com>
To: "Ben-Nes Michael" <miki(at)canaan(dot)co(dot)il>; <pgsql-general(at)postgresql(dot)org>
Sent: Thursday, August 23, 2001 10:18 PM
Subject: Re: [GENERAL] store in bytea
> > Hi
> >
> > Im using php to upload Binary data into bytea field.
> > The problem is that when I query what I uploaded I discover that it hold
> > only 13 characters and not the whole binary file
> >
> > I tried manual insert more the 13 characters successfully.
> > I tried to do addslashes($data);
> >
> > but still :(
> > $slashed_data = addslashes($data);
> > $sql = "insert into files (image_id, bin_data, filename, filesize,
> filetype)
> > values ('$image_id', '$slashed_data', '$new_name', '$filesize',
> > '$filetype');";
> >
> > I tried strlen($slashed_data); before the insert to be sure that that
the
> > binary is bigger then 13 characters and yes, its 4KB ( the tested
file );
> >
>
> I recently posted a PHP function which escapes data for insertion
> into a bytea column (for anyone who followed this from the last post,
> I found that I needed to add one more escaped character):
>
> function sqlesc($ct)
> {
> $buf = "";
> for ($i = 0; $i < strlen($ct); $i++)
> {
> if (ord($ct[$i]) == 0)
> $buf .= "\\\\000";
> else if (ord($ct[$i]) == 10)
> $buf .= "\\\\012";
> else if (ord($ct[$i]) == 39)
> $buf .= "\\\\047";
> else if (ord($ct[$i]) == 92)
> $buf .= "\\\\134";
> else
> $buf .= $ct[$i];
> }
> return $buf;
> }
>
>
> Here's an example of how to use it:
>
> $fp = fopen("/dev/urandom","r");
> $iv = fread($fp, 8);
> fclose($fp);
>
> $payload = "hello world";
>
> $ct = mcrypt_encrypt (MCRYPT_TRIPLEDES, "mykey", $payload,
> MCRYPT_MODE_CBC, $iv);
> $esc_ct = sqlesc($ct);
>
> $sql = "insert into foobar(f1,f2) values('$esc_ct',1)";
>
> $rs = pg_exec($conn, $sql);
>
>
> As far as storage is concerned, all escaped characters get converted back
> into their single byte equivilent for storage, so using bytea is the most
> efficient way to store binary in the database.
>
> However on retrieval, PostgreSQL will escape all "nonprintable" characters
> (based on the C "isprint()" function), which is quite a few. Your PHP app
> will have to unescape all of the nonprintable characters. I haven't
written
> a PHP function for that yet, but it shouldn't be too hard.
>
> I have started hacking the php pgsql extension to add pg_bytea_encode
> and pg_bytea_decode functions (so far the pg_bytea_encode is working).
> When I'm done I'll submit a patch to the PHP folks, and hopefully they
will
> accept it.
>
> Hope this helps,
>
> -- Joe
>
>
>
>
>
>
>
From | Date | Subject | |
---|---|---|---|
Next Message | Miroslav Koncar | 2001-08-24 06:23:56 | Re: problems transfering databases |
Previous Message | Steven D. Arnold | 2001-08-24 05:41:25 | number of parameters to a stored procedure |