web-dev-qa-db-fra.com

Troncature des données: données trop longues pour la colonne 'logo' à la ligne 1

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?

40
user3230425

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.

77
Aniket Kulkarni

Utilisez le type de données LONGBLOB au lieu de BLOB dans votre table de base de données.

12
Saurabh Kachhia

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.

8
13ushm4n