我将 Java JDBC 与 MySQL 一起使用,但出现此错误:
com.mysql.jdbc.MysqlDataTruncation: Data truncation:
Data too long for column 'column_name'
我该如何纠正这个错误?
我将 Java JDBC 与 MySQL 一起使用,但出现此错误:
com.mysql.jdbc.MysqlDataTruncation: Data truncation:
Data too long for column 'column_name'
我该如何纠正这个错误?
当我将图像文件作为字节插入数据库中时,我在 Spring Boot Data JPA 应用程序中遇到了同样的问题,它给了我同样的错误。
经过多次研发,我找到了如下解决方案。
我在 application.properties 文件中添加了以下行并解决了该问题
spring.datasource.url=jdbc:mysql://localhost:3306/conweb?sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'&jdbcCompliantTruncation=false
希望它对某人有帮助。
如何在 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.
这似乎很明显,而且确实如此。您显然试图插入或更新行,其“column_name”列的值大于该列的值。
例如,如果它是 CHAR 或 VARCHAR,则您的字符串可能比定义的列大小长。
您解决此问题的选择也有些明显 - 要么确保您存储的数据不大于列(可能通过在存储它们之前截断更长的字符串),或者增加数据库列的大小。
在上传 Image/Word/PDF 文件时,我在 Spring Boot 应用程序中遇到了同样的问题,并通过以下步骤修复了它:
解决方案
根据您的空间要求使用 Alter table 命令:
ALTER TABLE 'TABLE_NAME' MODIFY 'FIELD_NAME' MEDIUMBLOB;
注意:始终建议在数据库中保存链接而不是实际文件(具有大尺寸)。
在我的情况下,上传的数据包含引号('和“)。这就是为什么我得到你上面提到的同样的异常。删除数据中的引号后成功插入到表中。
我建议你使用 Spring Boot 和 Hibernate。我遇到了同样的问题,解决方案非常明显:
@Column(length = 65555)
@NotNull
private String content;
我也尝试了以下行,但这不知何故没有显示出任何效果:
@Size(min = 5, max = 65555)
我认为这可能会发生,因为 MySQL 表大小有默认约束,@Size
如果输入的值不在定义的范围内,Annotation 仅用于向用户反馈。我希望这可以解决您的问题!
出现此错误是因为您尝试插入列的数据大小太大。
解决方案 - 将列大小更改为最大。假设您的列是 VARCHAR 类型,然后在 mySQL
ALTER TABLE table_name CHANGE COLUMN col_name col_name VARCHAR(1000); //assuming 1000 is enough
对于那些偶然发现这里的人来说,类似错误可能还有另一个原因:
存储过程参数的类型可能是一个限制因素。
例如:您具有相应的列数据类型,并且将数据作为 LONGTEXT 发送到 MySQL 服务器,而您发送 LONGTEXT 数据的存储过程的参数可能具有 TEXT 类型。在这种情况下,您需要更新参数数据类型
在 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
在我们的例子中,只需重新启动应用程序即可解决问题,重新启动是指重新启动 tomcat。任何想法是否可能由于其他原因而发生此问题,但会像这样抛出错误。