22

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

com.mysql.jdbc.MysqlDataTruncation: Data truncation: 
Data too long for column 'column_name'

我该如何纠正这个错误?

4

10 回答 10

27

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

经过多次研发,我找到了如下解决方案。

我在 application.properties 文件中添加了以下行并解决了该问题

spring.datasource.url=jdbc:mysql://localhost:3306/conweb?sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'&jdbcCompliantTruncation=false

希望它对某人有帮助。

于 2017-06-04T13:16:20.647 回答
18

如何在 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)

这是您遇到的错误,但是在 MySQL 终端中将其显示为警告并仍然插入您的行,只是默默地截断它。

MySQL JDBC 没有那么宽容,并且会吐出一个硬错误并且不会插入该行。

2 解决方案

要么增加您要插入的数据类型的容量,要么减少您放入其中的内容的大小。

增加列大小的图例:

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.
于 2014-08-08T20:29:58.243 回答
9

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

例如,如果它是 CHAR 或 VARCHAR,则您的字符串可能比定义的列大小长。

您解决此问题的选择也有些明显 - 要么确保您存储的数据不大于列(可能通过在存储它们之前截断更长的字符串),或者增加数据库列的大小。

于 2012-11-26T15:03:14.363 回答
6

在上传 Image/Word/PDF 文件时,我在 Spring Boot 应用程序中遇到了同样的问题,并通过以下步骤修复了它:

解决方案

  1. 请查看您尝试上传的文件的大小。
  2. 然后将该文件大小与映射的数据库字段类型允许的最大大小进行比较。
  3. 例如对于 LOB:
    TINYBLOB ≈ 255 字节,BLOB ≈ 64KB,MEDIUMBLOB ≈ 16MB 和 LONGBLOB ≈ 4GB 运行
  4. 根据您的空间要求使用 Alter table 命令:

    ALTER TABLE 'TABLE_NAME' MODIFY 'FIELD_NAME' MEDIUMBLOB;

    注意:始终建议在数据库中保存链接而不是实际文件(具有大尺寸)。

于 2019-02-16T10:47:30.383 回答
3

在我的情况下,上传的数据包含引号('和“)。这就是为什么我得到你上面提到的同样的异常。删除数据中的引号后成功插入到表中。

于 2013-11-29T06:29:32.550 回答
2

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

    @Column(length = 65555)
    @NotNull
    private String content;

我也尝试了以下行,但这不知何故没有显示出任何效果:

@Size(min = 5, max = 65555)

我认为这可能会发生,因为 MySQL 表大小有默认约束,@Size如果输入的值不在定义的范围内,Annotation 仅用于向用户反馈。我希望这可以解决您的问题!

于 2021-04-21T20:47:29.933 回答
1

出现此错误是因为您尝试插入列的数据大小太大。

解决方案 - 将列大小更改为最大。假设您的列是 VARCHAR 类型,然后在 mySQL

ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough
于 2017-06-06T13:01:55.207 回答
1

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

存储过程参数的类型可能是一个限制因素。

例如:您具有相应的列数据类型,并且将数据作为 LONGTEXT 发送到 MySQL 服务器,而您发送 LONGTEXT 数据的存储过程的参数可能具有 TEXT 类型。在这种情况下,您需要更新参数数据类型

于 2019-07-04T07:52:19.937 回答
0

在 JPA 实体中,使用带有长度的注释 @Column。那应该可以解决问题。

示例代码:

@Entity
public class SampleEntity{

    @Column(length = 1200)
    private String column_name;

    // ...

}

根据您的喜好设置长度,它将在表中变为VARCHAR(length)。如果您提供更大的值,它将被创建为longtext

久经考验 - 创建 sql 脚本显示如下:

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;

参考 - https://www.baeldung.com/jpa-size-length-column-differences

于 2021-02-26T10:55:32.720 回答
-2

在我们的例子中,只需重新启动应用程序即可解决问题,重新启动是指重新启动 tomcat。任何想法是否可能由于其他原因而发生此问题,但会像这样抛出错误。

于 2021-02-03T05:45:48.683 回答