Postgresql и BLOB - максимальный размер байты? - PullRequest
4 голосов
/ 03 апреля 2012

Я сейчас пытаюсь сохранить изображения в таблице psql и следовал этому руководству здесь , используя bytea для изображения.Проблема в том, что изображение, которое я пытаюсь вставить, составляет ~ 24 КБ, и я получаю сообщение об ошибке, что максимальный размер составляет 8191, хотя в других местах я читал, что байт может хранить до 1 ГБ.Конечно, я должен каким-то образом поднять этот максимальный предел?

Код:

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;
}

В данный момент таблица базы данных состоит только из байты.

Сообщение об ошибке:

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

Ответы [ 2 ]

7 голосов
/ 03 апреля 2012

Очевидно, у вас есть индекс в этом столбце (честно говоря, я удивлен, что вы можете создать его - я бы ожидал, что Postgres отклонит это).

Индекс для столбца bytea на самом деле не имеет смысла.Если вы удалите этот индекс, все будет в порядке.

Реальный вопрос: почему вы создали индекс для столбца, в котором хранятся двоичные данные?

2 голосов
/ 03 апреля 2012

Если вам нужно убедиться, что вы не загружаете одно и то же изображение дважды, вы можете создать уникальный индекс для 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...