J'essaie d'insérer une photo dans une colonne BLOB d'une table MySQL et j'obtiens une exception:
Data too long for column 'logo' at row 1.
Voici le 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();
}
Comment résoudre ce problème?
Vous essayez d'insérer des données plus volumineuses que celles autorisées pour la colonne logo
.
Utilisez les types de données suivants selon vos besoins
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
Utilisez LONGBLOB
pour éviter cette exception.
Utilisez le type de données LONGBLOB
au lieu de BLOB
dans votre table de base de données.
La solution suivante a fonctionné pour moi. Lors de la connexion à la base de données, spécifiez que les données doivent être tronquées si elles sont trop longues (jdbcCompliantTruncation). Mon lien ressemble à ceci:
jdbc:mysql://SERVER:PORT_NO/SCHEMA?sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'&jdbcCompliantTruncation=false
Si vous augmentez la taille des chaînes, vous risquez à l'avenir de rencontrer le même problème si la chaîne que vous essayez de stocker dans la base de données est plus longue que la nouvelle taille.
EDIT: STRICT_TRANS_TABLES doit également être supprimé de sql_mode.