sqldataexception是sqlexception子类,专指数据与数据库列定义不兼容:类型不匹配、值超长/超范围/格式错误或向not null列插入null;须严格校验java参数与建表语句一致性。

SQLDataException 是 SQLException 的子类,专指数据本身与数据库列定义不兼容的问题——不是连接失败、语法错误或权限问题,而是“值放不进去”。核心就两点:类型对不上,或者值太大/太长/格式不对。
检查字段定义和Java参数是否严格匹配
数据库建表语句是唯一权威依据。比如:
-
INT(4) 列不能插入
"123abc"字符串,也不能插入超过 ±2147483647 的整数; - VARCHAR(20) 插入 25 个字符的字符串会直接报错;
-
DATE 列传入
"2026-13-01"或"2026/06/07"(未按yyyy-MM-dd格式)也会触发; -
NOT NULL 列传了
null,哪怕类型对得上,也属于 SQLDataException 范畴。
用 PreparedStatement 显式设值,别靠字符串拼接
拼接 SQL 容易隐式类型转换失败,且无法校验长度。必须用 setXxx() 方法并确保参数类型与列一致:
-
pstmt.setInt(1, 123)→ 对应数据库 INT / TINYINT / BIGINT(注意范围); -
pstmt.setString(2, str.substring(0, Math.min(str.length(), 50)))→ 对 VARCHAR(50) 强制截断; -
pstmt.setDate(3, Date.valueOf("2026-06-07"))→ 用标准日期对象,不传字符串; - 对可能为 null 的字段,用
pstmt.setNull(4, Types.VARCHAR)明确声明类型。
提前做数据校验和格式化
把校验逻辑前移到 Java 层,比等数据库报错再处理更友好:
- 插入前检查字符串长度:
if (name.length() > 32) throw new IllegalArgumentException("姓名超长"); - 数字字段加范围判断:
if (age 150) throw new IllegalArgumentException("年龄不合理"); - 日期统一用
LocalDate.parse(str, DateTimeFormatter.ofPattern("yyyy-MM-dd"))解析,捕获DateTimeParseException提前拦截; - 对金额等关键字段,优先使用
BigDecimal,避免浮点精度导致入库后值异常。
看懂异常堆栈里的关键线索
SQLDataException 的 message 通常含有效提示,例如:
-
Data truncation: Data too long for column 'email' at row 1→ 明确指出哪一列、多长; -
Cannot convert string 'abc' to integer→ 类型强转失败; -
Value '3000-01-01' is outside valid range for type java.sql.Date→ 日期越界。
配合 e.getSQLState()(如 22001 表示字符串数据右截断)和 e.getErrorCode()(MySQL 常见 1406),能快速定位数据库侧限制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











