DataIntegrityViolationException异常

564 阅读2分钟

“携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

报错内容

org.springframework.dao.DataIntegrityViolationException:
2022/8/19 16:25:16### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'rule' at row 102
2022/8/19 16:25:16### The error may involve defaultParameterMap
2022/8/19 16:25:16### The error occurred while setting parameters
2022/8/19 16:25:16### SQL: update task SET rule = ?,where id = ? 
2022/8/19 16:25:16### Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'rule' at row 102
2022/8/19 16:25:16; Data truncation: Data too long for column 'rule' at row 102; nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'rule' at row 102
2022/8/19 16:25:16	at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104) ~[spring-jdbc-5.1.18.RELEASE.jar!/:5.1.18.RELEASE]
2022/8/19 16:25:16	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) ~[spring-jdbc-5.1.18.RELEASE.jar!/:5.1.18.RELEASE]
2022/8/19 16:25:16	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-5.1.18.RELEASE.jar!/:5.1.18.RELEASE]
2022/8/19 16:25:16	... 63 more

问题分析

Data too long for column 'rule' at row 102; nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'rule' at row 102

从抛出的异常中不难看出,报错是因为往rule字段set的值超过了规定长度。

MySQL中有3种text类型:TEXT、MEDIUMTEXT、LONGTEXT。

text的长度

  • TEXT:65,535 bytes ~64kb
  • MEDIUMTEXT: 16,777,215 bytes ~16Mb
  • LONGTEXT: 4,294,967,295 bytes ~4Gb

拓展

spring的DAO层异常如下表:

异常何时抛出
CleanupFailureDataAccessException一项操作成功地执行,但在释放数据库资源时发生异常(例如,关闭一个Connection)
DataAccessResourceFailureException数据访问资源彻底失败,例如不能连接数据库
DataIntegrityViolationExceptionInsert或Update数据时违反了完整性,例如违反了惟一性限制
DataRetrievalFailureException某些数据不能被检测到,例如不能通过关键字找到一条记录
DeadlockLoserDataAccessException当前的操作因为死锁而失败
IncorrectUpdateSemanticsDataAccessExceptionUpdate时发生某些没有预料到的情况,例如更改超过预期的记录数。当这个异常被抛出时,执行着的事务不会被回滚
InvalidDataAccessApiusageException一个数据访问的JAVA API没有正确使用,例如必须在执行前编译好的查询编译失败了
invalidDataAccessResourceUsageException错误使用数据访问资源,例如用错误的SQL语法访问关系型数据库
OptimisticLockingFailureException乐观锁的失败。这将由ORM工具或用户的DAO实现抛出
TypemismatchDataAccessExceptionJava类型和数据类型不匹配,例如试图把String类型插入到数据库的数值型字段中
UncategorizedDataAccessException有错误发生,但无法归类到某一更为具体的异常中