数据截断:第1行的列'徽标'的数据太长

时间:2014-02-03 08:42:52

标签: java mysql jdbc

我正在尝试将照片插入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();
    }

如何解决这个问题?

4 个答案:

答案 0 :(得分:76)

您尝试插入的数据大于列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来避免此异常。

答案 1 :(得分:12)

在数据库表中使用数据类型LONGBLOB而不是BLOB

答案 2 :(得分:8)

以下解决方案为我工作。连接到db时,如果数据太长(jdbcCompliantTruncation),请指定应截断数据。我的链接如下所示:

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

如果增加字符串的大小,如果您尝试存储到数据库中的字符串长于新的字符串,则以后可能会遇到同样的问题。

编辑:STRICT_TRANS_TABLES也必须从sql_mode中删除。

答案 3 :(得分:0)

String,一般来说,应该用于短文本。默认情况下,它是一个 VARCHAR(255)

解决方案: 在实体中使用带有长度的@Column 注释。

示例:

@Entity
public class Users {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
     private String email;
     //..
     @Column(length = 1000) //1000 will be fine
     private String imgProfile;
}