Обсуждение: bytea problem

Поиск
Список
Период
Сортировка

bytea problem

От
alkampfer
Дата:
Hello, this is my problem :
I use java + postgres and I want to store image files into a table

my table : (id int,  image bytea)

the code :
                byte bytes[] = new byte[(int)file.length()];

                sqlq ="UPDATE table set image= ? where id=?";
                ps = .....prepareStatement(sqlq);
                ps.setBytes(2,bytes);
                ps.setString(2,id);

put the file into my table, stream of 41054 bytes, OK.

but when I retrieve it from the database resultSet.getBytes("image") gives
an array of 82108 bytes!!
worst of all those bytes I get have no sense at all, like 00 00  00 or 11
11....

thanks for the help!




--
View this message in context: http://postgresql.1045698.n5.nabble.com/bytea-problem-tp5014176p5014176.html
Sent from the PostgreSQL - jdbc mailing list archive at Nabble.com.

Re: bytea problem

От
"Mikael"
Дата:
Is this a typo or is the code like this ?

            ps.setBytes(2,bytes);
            ps.setString(2,id);


----- Original Message -----
From: "alkampfer" <kazucat@gmail.com>
To: <pgsql-jdbc@postgresql.org>
Sent: Tuesday, November 22, 2011 6:37 PM
Subject: [JDBC] bytea problem


> Hello, this is my problem :
> I use java + postgres and I want to store image files into a table
>
> my table : (id int,  image bytea)
>
> the code :
>                byte bytes[] = new byte[(int)file.length()];
>
>                sqlq ="UPDATE table set image= ? where id=?";
>                ps = .....prepareStatement(sqlq);
>                ps.setBytes(2,bytes);
>                ps.setString(2,id);
>
> put the file into my table, stream of 41054 bytes, OK.
>
> but when I retrieve it from the database resultSet.getBytes("image") gives
> an array of 82108 bytes!!
> worst of all those bytes I get have no sense at all, like 00 00  00 or 11
> 11....
>
> thanks for the help!
>
>
>
>
> --
> View this message in context:
> http://postgresql.1045698.n5.nabble.com/bytea-problem-tp5014176p5014176.html
> Sent from the PostgreSQL - jdbc mailing list archive at Nabble.com.
>
> --
> Sent via pgsql-jdbc mailing list (pgsql-jdbc@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-jdbc


Re: bytea problem

От
alkampfer
Дата:
it's s typo, sorry

            ps.setBytes(2,bytes);
            ps.setString(1,id);


--
View this message in context: http://postgresql.1045698.n5.nabble.com/bytea-problem-tp5014176p5014263.html
Sent from the PostgreSQL - jdbc mailing list archive at Nabble.com.

Re: bytea problem

От
Thomas Kellerer
Дата:
alkampfer wrote on 22.11.2011 18:37:
> Hello, this is my problem :
> I use java + postgres and I want to store image files into a table
>
> my table : (id int,  image bytea)
>
> the code :
>                  byte bytes[] = new byte[(int)file.length()];
>
>                  sqlq ="UPDATE table set image= ? where id=?";
>                  ps = .....prepareStatement(sqlq);
>                  ps.setBytes(2,bytes);
>                  ps.setString(2,id);
>
> put the file into my table, stream of 41054 bytes, OK.
>
> but when I retrieve it from the database resultSet.getBytes("image") gives
> an array of 82108 bytes!!
> worst of all those bytes I get have no sense at all, like 00 00  00 or 11
> 11....

How do you read the data into the bytes[] array?

I usually use setBinaryStream() instead of setBytes(), that saves me from "manually" reading the file content into an
array:

InputStream in = new FileInputStream(file);
sqlq ="UPDATE table set image= ? where id=?";
ps = .....prepareStatement(sqlq);
ps.setBinarayStream(1, in, (int)file.length());
ps.setString(2,id);



Re: bytea problem

От
chris humphrey
Дата:
I had this problem recently.
I had just upgraded from postgres 8 to 9, but did not get the jdbc
driver updated.

I read a posting that the bytea datatype was refactored in version 9,
and one indication was that twice as many bytes came out as went in...
this seems to be the case for you, so try looking at the version of the
jdbc driver and make sure you have a matching driver for your instance.

your code for the prepareStatement is how I am doing it and it now works
perfectly, since I updated my driver.

hope this helps.

On 11/22/2011 11:25 AM, Thomas Kellerer wrote:
> alkampfer wrote on 22.11.2011 18:37:
>> Hello, this is my problem :
>> I use java + postgres and I want to store image files into a table
>>
>> my table : (id int,  image bytea)
>>
>> the code :
>>                  byte bytes[] = new byte[(int)file.length()];
>>
>>                  sqlq ="UPDATE table set image= ? where id=?";
>>                  ps = .....prepareStatement(sqlq);
>>                  ps.setBytes(2,bytes);
>>                  ps.setString(2,id);
>>
>> put the file into my table, stream of 41054 bytes, OK.
>>
>> but when I retrieve it from the database resultSet.getBytes("image")
>> gives
>> an array of 82108 bytes!!
>> worst of all those bytes I get have no sense at all, like 00 00  00
>> or 11
>> 11....
>
> How do you read the data into the bytes[] array?
>
> I usually use setBinaryStream() instead of setBytes(), that saves me
> from "manually" reading the file content into an array:
>
> InputStream in = new FileInputStream(file);
> sqlq ="UPDATE table set image= ? where id=?";
> ps = .....prepareStatement(sqlq);
> ps.setBinarayStream(1, in, (int)file.length());
> ps.setString(2,id);
>
>
>
>


Re: bytea problem

От
alkampfer
Дата:
I tried using setBinarayStream too, but the result is the same : when I try
to get the data from the table
I get always an array of 82108 bytes without sense...

--
View this message in context: http://postgresql.1045698.n5.nabble.com/bytea-problem-tp5014176p5014586.html
Sent from the PostgreSQL - jdbc mailing list archive at Nabble.com.

Re: bytea problem

От
Maciek Sakrejda
Дата:
> I read a posting that the bytea datatype was refactored in version 9, and
> one indication was that twice as many bytes came out as went in...

I think the change in this default is what Chris is referring to:

http://www.postgresql.org/docs/9.0/static/runtime-config-client.html#GUC-BYTEA-OUTPUT

This certainly could affect what you're doing.
---
Maciek Sakrejda | System Architect | Truviso

1065 E. Hillsdale Blvd., Suite 215
Foster City, CA 94404
(650) 242-3500 Main
www.truviso.com

Re: bytea problem

От
chris humphrey
Дата:
I looked at the types of ways to store the data, and ensuring it was
hex, I could see the '\x' at the beginning of the string... Once I
matched the driver with the db all was happy.

May want to update the jdbc driver to know what version of db it is
talking to and either make the code compatable between the versions, or
reject the connection if it is the wrong (incompatable) version....

Once things started working for me, I got lazy and stopped thinking
about the problem....

On 11/22/2011 1:15 PM, Maciek Sakrejda wrote:
>> I read a posting that the bytea datatype was refactored in version 9, and
>> one indication was that twice as many bytes came out as went in...
> I think the change in this default is what Chris is referring to:
>
> http://www.postgresql.org/docs/9.0/static/runtime-config-client.html#GUC-BYTEA-OUTPUT
>
> This certainly could affect what you're doing.
> ---
> Maciek Sakrejda | System Architect | Truviso
>
> 1065 E. Hillsdale Blvd., Suite 215
> Foster City, CA 94404
> (650) 242-3500 Main
> www.truviso.com
>


Re: bytea problem

От
alkampfer
Дата:
I've just upgraded the jdbc to 9.1 and now works fine :) Thanks for your
help!

--
View this message in context: http://postgresql.1045698.n5.nabble.com/bytea-problem-tp5014176p5014823.html
Sent from the PostgreSQL - jdbc mailing list archive at Nabble.com.