数据截断:第 1 行的“logo”列数据太长

Posted

技术标签:

【中文标题】数据截断:第 1 行的“logo”列数据太长【英文标题】:Data truncation: Data too long for column 'logo' at row 1 【发布时间】:2014-02-26 16:11:10 【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

你有三个选择来解决这个问题。 1. 增加列数据类型的大小。 2. 减小插入该列的内容的大小。 3. 不要插入信息。 【参考方案1】:

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

【讨论】:

【参考方案2】:

您正在尝试插入大于列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 来避免这个异常。

【讨论】:

我有一个长度为 50 的 VARCHAR 字段,而这个字符串 'amsterdam 12234 2^)(&*||' 即使它的长度小于 50,也会给我同样的错误。是否有任何限制数据格式也是?【参考方案3】:

以下解决方案对我有用。连接到数据库时,指定如果数据太长应截断(jdbcCompliantTruncation)。我的链接如下所示:

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

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

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

【讨论】:

这部分“jdbcCompliantTruncation=false”是我真正需要的,因为首先我删除了 STRICT_TRANS_TABLES 并且没有任何效果。非常感谢!【参考方案4】:

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;

【讨论】:

以上是关于数据截断:第 1 行的“logo”列数据太长的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:字符串数据,右截断:1406 列数据太长

MySQL 太长 varchar 截断/错误设置

MysqlDataTruncation:数据截断:第 1 行列“列”的值超出范围

数据截断:不正确的日期时间值:''

SQLSTATE [01000]:警告:1265 列的数据被截断

MySql 数据在第 1 行截断列“值”