web-dev-qa-db-ja.com

データの切り捨て:行1の列 'logo'のデータが長すぎます

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();
    }

この問題を解決するにはどうすればよいですか?

40
user3230425

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を使用します。

77
Aniket Kulkarni

データベーステーブルでLONGBLOBの代わりにデータ型BLOBを使用します。

12
Saurabh Kachhia

次の解決策は私のために働いた。データベースに接続するときに、データが長すぎる場合は切り捨てる必要があることを指定します(jdbcCompliantTruncation)。私のリンクは次のようになります。

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

文字列のサイズを大きくした場合、DBに保存しようとしている文字列が新しいサイズよりも長いと、将来同じ問題に直面する可能性があります。

編集:STRICT_TRANS_TABLESもsql_modeから削除する必要があります。

8
13ushm4n