Усечение данных: слишком длинны данные для столбца "логотип" в строке 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();
}
Как решить эту проблему?
Ответы
Ответ 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.