该错误是mysql严格模式拒绝越界值所致,需三选一解决:改数据、改表结构或临时放宽sql模式;须先用describe确认字段类型与范围,再针对性处理。

直接说结论:这个错误不是数据“写错了”,而是MySQL在严格模式下拒绝了越界的值——要么改数据,要么改表结构,要么临时放宽SQL模式,三选一,没有第四种。
查清具体是哪个字段、什么类型、值超了多少
错误信息里带了 column 'age' at row 1 这种线索,但光看名字不够。必须确认该字段的真实定义:
- 运行
DESCRIBE users;或SHOW COLUMNS FROM users LIKE 'age';,重点看Type列,比如TINYINT(3) UNSIGNED表示范围是 0–255,不是“最多存3位数” - 检查你插入的值,比如
INSERT INTO users (age) VALUES (300);—— 300 对TINYINT UNSIGNED就是越界 - 注意隐式转换:MyBatis 传
Long给INT字段、Javadouble写入FLOAT,都可能触发溢出,不一定是肉眼可见的大数
修改表结构是最稳妥的长期方案
如果业务上确实需要更大的值(比如用户年龄未来要支持百岁以上、薪资字段实际已达千万级),别硬塞,直接升级字段类型:
-
ALTER TABLE users MODIFY COLUMN age SMALLINT UNSIGNED;—— 从TINYINT升到SMALLINT,范围变成 0–65535 -
ALTER TABLE orders MODIFY COLUMN amount DECIMAL(18,2);—— 比DOUBLE更安全,避免浮点精度和溢出问题 - 主键自增列也要留意:
SHOW CREATE TABLE logs;看AUTO_INCREMENT值是否已逼近INT上限(2147483647),真快到了就该切BIGINT
临时绕过需谨慎:调整 sql_mode
开发或迁移阶段想快速跑通,可以关掉严格模式,但别在线上长期这么干:
- 会话级生效(只影响当前连接):
SET sql_mode = '';或SET sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; - 全局配置(需重启 MySQL):修改
my.cnf中的sql-mode,去掉STRICT_TRANS_TABLES或TRADITIONAL - 风险提示:非事务引擎(如 MyISAM)下,关严格模式后越界值会被静默截断成极值(比如
TINYINT存 300 → 变成 255),且不报错不警告,数据就悄悄变了
最常被忽略的一点:这个错误往往不是孤立出现的。它背后通常意味着应用层没做输入校验,或者建表时对业务增长预估不足。改完 SQL 或字段后,顺手在代码里加一道 if (value > MAX_INT_FOR_COLUMN) throw ... 才算闭环。











