MySQLテーブルのBLOB列に写真を挿入しようとしていますが、例外が発生します。
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();
}
この問題を解決するにはどうすればよいですか?
列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
を使用します。
データベーステーブルでLONGBLOB
の代わりにデータ型BLOB
を使用します。
次の解決策は私のために働いた。データベースに接続するときに、データが長すぎる場合は切り捨てる必要があることを指定します(jdbcCompliantTruncation)。私のリンクは次のようになります。
jdbc:mysql://SERVER:PORT_NO/SCHEMA?sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'&jdbcCompliantTruncation=false
文字列のサイズを大きくした場合、DBに保存しようとしている文字列が新しいサイズよりも長いと、将来同じ問題に直面する可能性があります。
編集:STRICT_TRANS_TABLESもsql_modeから削除する必要があります。