解决错误:Caused by: java.sql.SQLException: Data truncated for column ‘birthday‘ at row 1

本文探讨了在配置Mybatis核心配置文件时遇到的Datatruncated异常,重点在于如何修复因将Date类型转换为java.sql.Date导致的问题,通过导入java.util.Date并提供解决方案。

项目场景:

学习Mybatis的核心配置文件的深入的时候出现上面的错误


问题描述

org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: java.sql.SQLException: Data truncated for column 'birthday' at row 1
### The error may involve com.wxy.mapper.UserMapper.save-Inline
### The error occurred while setting parameters
### SQL: insert into user values (?,?,?,?)
### Cause: java.sql.SQLException: Data truncated for column 'birthday' at row 1

	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:200)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:185)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:58)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
	at com.sun.proxy.$Proxy5.save(Unknown Source)
	at com.wxy.test.MybatisTest.test1(MybatisTest.java:28)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
Caused by: java.sql.SQLException: Data truncated for column 'birthday' at row 1
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2484)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
	at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1197)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59)
	at com.sun.proxy.$Proxy7.execute(Unknown Source)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:46)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:74)
	at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
	at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
	at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
	... 27 more

原因分析:

虽然这里显示的是数据库的错误,但是实际上是因为我们呢调用了Date这个方法的时候,系统默认使用java.sql.Date;那么我们需要重新导入java.util.Date才可以


解决方案:

import java.util.Date;

希望对你有帮助!

加油!

### 回答问题:`java.sql.SQLException: Data truncated for column 'incident_type' at row 1` 是什么错误?如何解决? #### **回答:** 这个错误的意思是: > 向数据库插入或更新数据时,**`incident_type` 字段的值超出了该字段定义的长度限制**,导致数据被“截断”(truncated),MySQL 拒绝了操作。 这通常发生在你尝试插入像 `'fall'`、`'illness'` 这样的字符串到一个 **长度不足以容纳这些内容的 `VARCHAR(N)` 字段中**,比如 `VARCHAR(4)` 只能存 4 个字符,而 `'illness'` 有 7 个字符,就会被截断并报错。 --- #### **解释与解决方案:** ##### ✅ 1. **检查数据库表结构** 运行以下 SQL 查看 `incident_type` 字段定义: ```sql DESCRIBE incident_records; -- 或 SHOW CREATE TABLE incident_records; ``` 重点关注输出中的 `incident_type` 行,例如: ```sql incident_type VARCHAR(6) DEFAULT NULL ``` 如果当前最大值是 `VARCHAR(6)`,那可以存储 `'fall'`(4)、`'other'`(5),但 `'illness'`(7)就超过了 → 被截断 → 报错。 ##### ✅ 2. **修改数据库字段长度** 建议将 `incident_type` 扩展为至少 `VARCHAR(20)`,以支持所有类型和未来扩展。 执行 SQL 修改: ```sql ALTER TABLE incident_records MODIFY COLUMN incident_type VARCHAR(20); ``` ✅ 推荐取值对照: | 类型 | 长度 | |------------|------| | fall | 4 | | illness | 7 | | quarrel | 7 | | other | 4 | → 所以 `VARCHAR(10)` 就够用,但推荐留余量设为 `VARCHAR(20)`。 ##### ✅ 3. **前端提交的数据是否匹配后端枚举?** 确保前端传给后端的 `incidentType` 值是后端允许的枚举值,并且拼写一致。例如: ```js <el-option label="跌倒" value="fall" /> <el-option label="突发疾病" value="illness" /> <el-option label="争吵" value="quarrel" /> <el-option label="其他" value="other" /> ``` ⚠️ 注意不要出现拼写错误如 `"illess"`、`"sudden_illness"` 等,否则即使长度没问题也会引起后端校验失败或数据库异常。 ##### ✅ 4. **Java 实体类与数据库字段一致性** 检查 Java 实体类 `IncidentRecords.java` 是否有字段注解限制: ```java @Column(name = "incident_type", length = 6) private String incidentType; ``` 如果有,请同步修改为: ```java @Column(name = "incident_type", length = 20) private String incidentType; ``` 然后重新生成 DDL 或使用 JPA/Hibernate 的 `ddl-auto: update`(仅开发环境可用)。 ##### ✅ 5. **MyBatisMyBatis-Plus 映射问题** 确认你的 XML 或 Mapper 中没有硬编码字段长度限制,或者 SQL 插入语句中没有手动拼接导致的问题。 建议使用参数化查询,避免直接字符串拼接。 --- ### ✅ 最终修复步骤总结: | 步骤 | 操作 | |------|------| | 1 | 登录数据库,查看 `incident_type` 当前长度:`DESCRIBE incident_records;` | | 2 | 如果小于 10,执行:`ALTER TABLE incident_records MODIFY COLUMN incident_type VARCHAR(20);` | | 3 | 检查 Java 实体类字段长度是否匹配 | | 4 | 确保前端传递的 `value` 是后端接受的标准字符串(如 `fall`, `illness`) | | 5 | 测试新增一条含 `illness` 类型的记录,验证是否成功 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值