Подтвердить что ты не робот

Усечение данных: слишком длинны данные для столбца "логотип" в строке 1

Я пытаюсь вставить фотографию в столбец BLOB таблицы MySQL, и я получаю исключение:

Data too long for column 'logo' at row 1. 

Вот JDBC:

    int idRestaurant = 42;
    String restoname=  "test";
    String restostatus=  "test";
    InputStream fileContent = getUploadedFile();
    int fileSize = getUploadedFileSize();

    Class.forName("com.mysql.jdbc.Driver");
    try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/resto" , "root" , "" )) {
        PreparedStatement ps = conn.prepareStatement("insert into restaurants (idRestaurant, restaurantName, status, logo) values(?,?,?,?)");
        ps.setInt(1, idRestaurant);
        ps.setString(2, restoname);
        ps.setString(3, restostatus);
        ps.setBinaryStream(4, fileContent, fileSize);
        ps.executeUpdate();
        conn.commit();
    }

Как решить эту проблему?

4b9b3361

Ответ 1

Вы пытаетесь вставить данные, которые больше, чем разрешено для столбца logo.

Используйте следующие типы данных в соответствии с вашими потребностями

TINYBLOB   :     maximum length of 255 bytes  
BLOB       :     maximum length of 65,535 bytes  
MEDIUMBLOB :     maximum length of 16,777,215 bytes  
LONGBLOB   :     maximum length of 4,294,967,295 bytes  

Используйте LONGBLOB, чтобы избежать этого исключения.

Ответ 2

Используйте тип данных LONGBLOB вместо BLOB в таблице базы данных.

Ответ 3

Следующее решение сработало для меня. При подключении к db укажите, что данные должны быть усечены, если они слишком длинны (jdbcCompliantTruncation). Моя ссылка выглядит так:

jdbc:mysql://SERVER:PORT_NO/SCHEMA?sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'&jdbcCompliantTruncation=false

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

EDIT: STRICT_TRANS_TABLES также необходимо удалить из sql_mode.