我目前正在尝试将图像存储在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
答案 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)