MySQL sql_mode严格模式报错修复方法 MySQL
前言
导入或写入时报 "Data too long"、"Incorrect value"、"STRICT_TRANS_TABLES",多是 sql_mode 严格模式拒绝了不规范数据。不同版本默认值不同,老代码迁移常踩。本文讲解查看、临时修改、永久配置、常见报错对照。
操作步骤
1. 查看当前 sql_mode
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
2. 临时取消严格模式(当前会话)
SET SESSION sql_mode='';
3. 全局临时修改
SET GLOBAL sql_mode='NO_ENGINE_SUBSTITUTION';
4. 永久写入 my.cnf
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION
重启生效。
5. 常见严格规则
STRICT_TRANS_TABLES 严格校验类型;NO_ZERO_DATE 禁止零日期;ONLY_FULL_GROUP_BY 要求 group by 列完整。
6. 校验
SELECT @@sql_mode;
常见坑
- 只改 SESSION,重连回到全局默认,问题复现。
- 永久改 my.cnf 后没重启,配置不生效。
- 关闭严格模式会让脏数据写进去,掩盖代码问题。
- ONLY_FULL_GROUP_BY 导致老 GROUP BY 查询报错,建议修 SQL 而非关模式。
- 云数据库参数组里修改,别只改本地文件。
- 不同版本默认 sql_mode 差异大,迁移先对齐。
- 改全局后已有连接仍用旧值,需重连。
总结
先 SELECT @@sql_mode 定位规则,SET GLOBAL 临时调,my.cnf 永久写并重启。优先修不规范 SQL 而非全盘关闭严格模式;ONLY_FULL_GROUP_BY 等规则建议保留。改全局后重连,云库走参数组。
遇到问题加QQ23979811 协助处理