Полагаю, вы перепутали капли в стиле OID и BYTEA. Большие двоичные объекты хранятся косвенно с колонками OID в Postgres. Фактические данные файла хранятся где-то за пределами таблицы базы данных Postgres. Столбец просто содержит идентификатор объекта, который внутренне связан с большим двоичным объектом. Например:
janko=# CREATE TABLE blobtest1 (name CHAR(30), image OID);
CREATE TABLE
janko=# INSERT INTO blobtest1 VALUES ('stackoverflow', lo_import('/tmp/stackoverflow-logo.png'));
INSERT 0 1
janko=# SELECT * FROM blobtest1;
name | image
--------------------------------+-------
stackoverflow | 16389
(1 row)
Если вы используете метод ResultSet#getBlob(String)
, то ожидается столбец стиля OID. getBlob
читает данные из столбца и преобразует их в Long
. Затем он пытается прочитать связанные двоичные данные из своего внутреннего хранилища.
С другой стороны, с помощью BYTEA вы можете помещать небольшие кусочки двоичных данных непосредственно в вашу БД. Например:
janko=# CREATE TABLE blobtest2 (name CHAR(30), image BYTEA);
CREATE TABLE
janko=# INSERT INTO blobtest2 VALUES ('somebinary', E'\\336\\255\\276\\357\\336\\255\\276\\357');
INSERT 0 1
janko=# SELECT * FROM blobtest2;
name | image
--------------------------------+----------------------------------
somebinary | \336\255\276\357\336\255\276\357
(1 row)
Здесь столбец данных содержит двоичные данные. Если вы попытаетесь использовать getBlob
в таком столбце, данные все равно будут интерпретироваться как OID, но, очевидно, они не будут вписываться в Long
. Давайте попробуем это на базе данных, которую мы только что создали:
groovy:000> import java.sql.*
===> [import java.sql.*]
groovy:000> Class.forName("org.postgresql.Driver");
===> class org.postgresql.Driver
groovy:000> db = DriverManager.getConnection("jdbc:postgresql:janko", "janko", "qwertz");
===> org.postgresql.jdbc4.Jdbc4Connection@3a0b2c64
groovy:000> ps = db.prepareStatement("SELECT image FROM blobtest2 WHERE name = ?");
===> SELECT image FROM blobtest2 WHERE name = ?
groovy:000> ps.setString(1, "somebinary")
===> null
groovy:000> rs = ps.executeQuery()
===> org.postgresql.jdbc4.Jdbc4ResultSet@66f9104a
groovy:000> rs.next()
===> true
groovy:000> rs.getBlob("image")
ERROR org.postgresql.util.PSQLException: Bad value for type long : \336\255\276\357\336\255\276\357
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.toLong (AbstractJdbc2ResultSet.java:2796)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getLong (AbstractJdbc2ResultSet.java:2019)
at org.postgresql.jdbc4.Jdbc4ResultSet.getBlob (Jdbc4ResultSet.java:52)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getBlob (AbstractJdbc2ResultSet.java:335)
at groovysh_evaluate.run (groovysh_evaluate:3)
...