Postgresql和BLOBs - bytea的最大大小?

Nai*_*ait 4 postgresql jdbc

我目前正在尝试将图像存储在psql表中,并在此处使用bytea作为图像.问题是,我试图插入图像〜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;
}
Run Code Online (Sandbox Code Playgroud)

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

错误信息:

org.postgresql.util.PSQLException: ERROR: index row requires 23888 bytes, maximum size is 8191
Run Code Online (Sandbox Code Playgroud)

Sco*_*owe 8

如果您需要确保不会两次上传相同的图像,您可以在 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.
Run Code Online (Sandbox Code Playgroud)


a_h*_*ame 7

显然你有一个关于该列的索引(说实话,我很惊讶你可以创建它 - 我希望Postgres拒绝这一点).

bytea列上的索引实际上没有意义.如果删除该索引,则应该没问题.

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

  • 我不认为我想回答这个问题:( (3认同)
  • 二进制数据不一定很大.如果只在bytea中存储几个字节,则使用带索引的bytea列是非常合理的. (2认同)

Evg*_*rev 6

bytea 最大尺寸

根据这个旧线程,Postgres 中字段的最大大小为1 GB。

PostgreSQL 版本 12 协议行大小限制为 2 GiB 减去消息头在发送到客户端 ( SELECTed ) 时。(该协议使用 32 位有符号整数来表示消息大小。)没有发现其他限制(另一个主题)。

但是对象存储为多个bytea记录,因此它们不受这种方式的限制。请参阅此文档