Java com.mysql.jdbc.MysqlDataTruncation:数据截断:数据对于列';列名称';

Java com.mysql.jdbc.MysqlDataTruncation:数据截断:数据对于列';列名称';,java,mysql,truncation,Java,Mysql,Truncation,我将Java JDBC与MySQL一起使用,出现以下错误: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'column_name' ALTER TABLE table_name CHANGE COLUMN col_name col_name VARCHAR(1000); //assuming 1000 is enough 如何纠正此错误?这似乎很明显,事实确实如此。显然,您试

我将Java JDBC与MySQL一起使用,出现以下错误:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: 
Data too long for column 'column_name'
ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough

如何纠正此错误?

这似乎很明显,事实确实如此。显然,您试图插入或更新一行,该行的“column_name”列的值大于该列的值

ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
例如,如果它是CHAR或VARCHAR,则可能有一个字符串比定义的列大小长

ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough

解决这个问题的选择也有些明显——要么确保存储的数据不大于列(可能在存储之前截断较长的字符串),要么增加数据库列的大小。

在我的例子中,上载的数据包含引号('and')。这就是为什么我会遇到与您上面提到的相同的异常。在删除成功插入到表中的数据中的引号后。

如何在mysql终端中重现此错误:

mysql> create table penguins(val CHAR(2));
Query OK, 0 rows affected (0.08 sec)

mysql> insert into penguins values("AB");
Query OK, 1 row affected (0.00 sec)

mysql> insert into penguins values("ABC");
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;
+---------+------+------------------------------------------+
| Level   | Code | Message                                  |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'val' at row 1 |
+---------+------+------------------------------------------+
1 row in set (0.00 sec)
If you are using   then use this
-----------------  --------------
smallint           int
int                long
TEXT               LONGTEXT
LONGTEXT           CLOB
CLOB               Store the content to disk, and save the filename in the db.
ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
这是您得到的错误,但是在MySQL终端中,它显示为警告,仍然插入您的行,只是默默地截断它

ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
MySQL JDBC没有那么宽容,它抛出了一个硬错误,并且不会插入行

ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
2个解决方案

ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
增加要插入的数据类型的容量,或者减小要放入其中的内容的大小

ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
增加列大小的图例:

mysql> create table penguins(val CHAR(2));
Query OK, 0 rows affected (0.08 sec)

mysql> insert into penguins values("AB");
Query OK, 1 row affected (0.00 sec)

mysql> insert into penguins values("ABC");
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;
+---------+------+------------------------------------------+
| Level   | Code | Message                                  |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'val' at row 1 |
+---------+------+------------------------------------------+
1 row in set (0.00 sec)
If you are using   then use this
-----------------  --------------
smallint           int
int                long
TEXT               LONGTEXT
LONGTEXT           CLOB
CLOB               Store the content to disk, and save the filename in the db.
ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough

我在SpringBootDataJPA应用程序中遇到了同样的问题,当时我打算将图像文件作为字节插入数据库,因为它给了我同样的错误

ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
经过多次研发,我找到了如下解决方案

ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
我在application.properties文件中添加了以下行,并解决了这个问题

spring.datasource.url=jdbc:mysql://localhost:3306/conweb?sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'&jdbcCompliantTruncation=false
ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough

希望对其他人有所帮助。

出现此错误是因为您试图插入到列中的数据太大

ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
解决方案-将列大小更改为max。假设您的列是VARCHAR类型,则在mySQL中

ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough

在我的Spring Boot应用程序中,我在上载 Image/Word/PDF文件,并通过以下步骤修复它:

ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
解决方案

ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
  • 请看一下您正在尝试创建的文件的大小 上传
  • 然后将该文件大小与 映射的数据库字段类型
  • 例如,对于LOB:
    TINYBLOB≈ 255字节,BLOB≈ 64KB,中绿叶≈ 16MB和LONGBLOB≈ 4GB运行
  • 根据您的空间要求使用Alter table命令:

    ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
    
    更改表格“表格名称”修改“字段名称”MEDIUMBLOB

    ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
    
    注意:始终建议保存链接,但不要保存实际文件(具有较大的 大小)以DB为单位

  • ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
    

    对于那些在这里偶然发现类似错误的人,可能还有另一个原因:

    ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
    
    存储过程参数的类型可能是一个限制因素。

    ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
    

    例如:您有相应的列数据类型,并且数据作为LONGTEXT发送到MySQL服务器,而您要向其发送LONGTEXT数据的存储过程的参数可能有TEXT类型。在这种情况下,您需要更新参数数据类型。在我们的情况下,只需重新启动应用程序就可以通过重新启动I me解决问题一个重新启动的tomcat。如果这个问题是由于其他原因引起的,你有什么想法吗?但是错误是这样抛出的。

    在JPA实体中,使用长度为的annotation@Column。这应该可以解决问题

    ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
    
    示例代码:

    ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
    
    @Entity
    public class SampleEntity{
    
        @Column(length = 1200)
        private String column_name;
    
        // ...
    
    }
    
    根据您的偏好设置长度,它将成为表中的VARCHAR(length)。如果您给出更大的值,它将被创建为longtext

    ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
    
    经过尝试和测试-创建sql脚本如下所示:

    ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
    
    CREATE TABLE `SampleEntity` (
      `id` bigint(20) NOT NULL,
      `dateCreated` datetime DEFAULT NULL,
      `dateModified` datetime DEFAULT NULL,
      `column_name` longtext,
      `userName` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    参考-

    我建议您使用Spring Boot和Hibernate。我遇到了同样的问题,解决方案非常明显:

    ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
    
        @Column(length = 65555)
        @NotNull
        private String content;
    
    我也试过下面这句话,但不知怎么的,没有显示出任何效果:

    ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
    
    @Size(min = 5, max = 65555)
    
    我认为这可能是因为MySQL表大小有默认约束,如果输入的值不在定义的范围内,
    @Size
    注释只用于向用户反馈。
    我希望这能解决您的问题!

    如果它是一个文本字段怎么办?或者,正如其他人所指出的,在jdbc连接字符串中使用jdbcomplianttrunation=false。将VARCHAR更改为text也会有帮助。我正在尝试将java.uitl.map转换为字符串化的json字符串并尝试将其持久化。我遇到了上述错误,如果是由于引号ma引起的那么我不能用你的答案了——那么我们可以用一个转义字符吗?谢谢,这很有帮助
    ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough