我的猜测是,您混合使用了OID和BYTEA样式的Blob。大型二进制对象与Ogre列间接存储在Postgres中。实际的文件数据由Postgres存储在数据库表之外的某个位置。该列仅包含一个对象标识符,该标识符在内部与Blob相关联。例如:
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 1janko=# 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 TABLEjanko=# INSERT INTO blobtest2 VALUES ('somebinary', E'\336\255\276\357\336\255\276\357');INSERT 0 1janko=# SELECt * FROM blobtest2; name | image--------------------------------+---------------------------------- somebinary | 336255276357336255276357(1 row)在这里,数据列直接包含二进制数据。如果您尝试
getBlob在这样的列上使用,数据仍会被解释为OID,但显然不会适合
Long。让我们在刚刚创建的数据库上尝试一下:
groovy:000> import java.sql.*===> [import java.sql.*]groovy:000> Class.forName("org.postgresql.Driver");===> class org.postgresql.Drivergroovy:000> db = DriverManager.getConnection("jdbc:postgresql:janko", "janko", "qwertz");===> org.postgresql.jdbc4.Jdbc4Connection@3a0b2c64groovy:000> ps = db.prepareStatement("SELECt image FROM blobtest2 WHERe name = ?");===> SELECt image FROM blobtest2 WHERe name = ?groovy:000> ps.setString(1, "somebinary")===> nullgroovy:000> rs = ps.executeQuery()===> org.postgresql.jdbc4.Jdbc4ResultSet@66f9104agroovy:000> rs.next()===> truegroovy:000> rs.getBlob("image")ERROR org.postgresql.util.PSQLException: Bad value for type long : 336255276357336255276357 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) ...


