Postgresql和BLOBs - bytea的最大大小?

时间:2012-04-03 12:58:49

标签: postgresql jdbc

我目前正在尝试将图像存储在psql表中,并使用bytea作为图像,遵循本指南here。问题是我试图插入的图像是~24kb并且我一直收到最大大小为8191的错误,尽管我在其他地方读过一个bytea应该能够存储多达1gb。当然,我应该能够以某种方式提高这个最大限度?

代码:

String query = "INSERT INTO " + tableName + " VALUES(?);";
try {
    PreparedStatement stmt = conn.prepareStatement(query);
    File file = new File(location);
    FileInputStream fi = new FileInputStream(file);
    stmt.setBinaryStream(1, fi, (int)file.length());
    boolean res = stmt.execute();
    stmt.close();
    fi.close
    return res;
}

数据库表目前只包含一个bytea。

错误讯息:

org.postgresql.util.PSQLException: ERROR: index row requires 23888 bytes, maximum size is 8191

3 个答案:

答案 0 :(得分:7)

显然你在该专栏上有一个索引(说实话,我很惊讶你可以创建它 - 我希望Postgres拒绝这一点)。

bytea列上的索引并没有多大意义。如果删除该索引,则应该没问题。

真正的问题是:为什么要在存储二进制数据的列上创建索引?

答案 1 :(得分:3)

如果您需要确保两次不上传相同的图像,可以在bytea的md5(或其他一些哈希)上创建唯一索引:

create table a(a bytea);
create unique index a_bytea_unique_hash on a (md5(a));
insert into a values ('abc');
INSERT 0 1
insert into a values ('abc');
ERROR:  duplicate key value violates unique constraint "a_bytea_unique_hash"
DETAIL:  Key (md5(a))=(900150983cd24fb0d6963f7d28e17f72) already exists.

答案 2 :(得分:0)

bytea的最大大小

根据this thread,Postgres中字段的最大大小为 1 GB。 找不到其他限制(another topic)。

但是大对象可能工作更快。请参见this docs