Добавление изображения в базу данных на Java - PullRequest
5 голосов
/ 09 марта 2009

Я пытаюсь добавить изображение в поле BLOB в базе данных mysql. Размер изображения будет менее 100 КБ. Однако я сталкиваюсь с проблемами, и мне было интересно, как лучше добавить эти данные в базу данных?

com.mysql.jdbc.MysqlDataTruncation: усечение данных: слишком длинные данные для столбца «Данные» в строке 1

PreparedStatement addImage = conn.prepareStatement("INSERT INTO Images (Width, Height, Data) VALUES (?,?,?)",Statement.RETURN_GENERATED_KEYS);

Ниже приведен метод, который я использую для добавления изображения в базу данных.

public int addImage(Image image) throws SQLException, IllegalArgumentException
{
    this.addImage.clearParameters();
    byte[] imageData = ImageConverter.convertToBytes(image);
    int width = image.getWidth(null);
    int height = image.getHeight(null);
    if (width == -1 || height == -1)
    {
        throw new IllegalArgumentException("You must load the image first.");
    }



    this.addImage.setInt(1, width);
    this.addImage.setInt(2, height);
    this.addImage.setBytes(3, imageData);
    this.addImage.executeUpdate();

    ResultSet rs = this.addImage.getGeneratedKeys();
    rs.next();

    return rs.getInt(1);
}

Определение SQL для таблицы

После изменения типа поля данных на Mediumblob и попытки поместить файл изображения размером 140 КБ в базу данных я получил другую ошибку.

com.mysql.jdbc.PacketTooBigException: слишком большой пакет для запроса

Проблема в том, как я пытаюсь добавить данные в базу данных. Должен ли я выбрать другой подход? Если да, то каким образом?

Ответы [ 4 ]

6 голосов
/ 09 марта 2009

Попробуйте использовать MEDIUMBLOB вместо BLOB. BLOB ограничен 64 КБ, тогда как столбец MEDIUMBLOB может содержать 16 МБ.

См. Раздел «Требования к хранилищу для строковых типов» на этой странице .

2 голосов
/ 09 марта 2009

Чтобы справиться с PacketTooBigException , похоже, вам необходимо настроить переменную конфигурации max_allowed_packet. См. http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html. Однако по умолчанию MySQL 5.1 не должен вызывать проблем с объемом до 1 МБ. Какую версию MySQL вы используете (и сервер, и клиент).

1 голос
/ 09 марта 2009

Попробуйте setBlob вместо setBytes

0 голосов
/ 04 июля 2012

Просто выполните запрос ниже в начале проекта ...

SET GLOBAL max_allowed_packet = 1024*1024*number of MB

т.е.

SET GLOBAL max_allowed_packet = 1024*1024*14

Также прочитайте это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...