MySQL 5.7+默认严格模式导致旧SQL报错,可临时用SET SESSION sql_mode修改会话级配置,或永久修改my.cnf中sql_mode并重启,云数据库需通过控制台调整。 MySQL 5.7+ 默认 strict mode 导致旧 SQL 报错怎么办 很多从旧版本升级到 MySQL
MySQL 5.7+默认严格模式导致旧SQL报错,可临时用SET SESSION sql_mode修改会话级配置,或永久修改my.cnf中sql_mode并重启,云数据库需通过控制台调整。

很多从旧版本升级到 MySQL 5.7 或更高版本的朋友,都遇到过这样一个问题:以前跑得好好的应用,突然开始报错,提示数据插入失败或类型不匹配。这背后,往往不是代码写错了,而是数据库的“脾气”变了。从 5.7 版本开始,MySQL 默认启用了严格模式(主要包括 STRICT_TRANS_TABLES 和 STRICT_ALL_TABLES)。这意味着,那些过去被“睁一只眼闭一只眼”放行的操作——比如隐式类型转换、往 NOT NULL 字段里塞空字符串、或者字符串超长被悄悄截断——现在都会直接抛出错误,而不是给个警告就继续执行。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
这当然不是 Bug,而是 MySQL 为了数据严谨性做出的主动调整。但话说回来,如果老应用一时半会儿改不完,我们有没有办法“关掉”这个严格模式呢?答案是肯定的,不过在动手之前,必须清楚这么做的潜在后果。
动手调整前,先得摸清现状。连接到你的 MySQL 数据库,执行下面这个命令:
SELECT @@sql_mode;
常见的输出结果可能长这样:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION。
这一长串里,哪些是导致旧 SQL 语句“暴毙”的元凶呢?核心就盯住这两个:STRICT_TRANS_TABLES(针对事务存储引擎的表生效)和 STRICT_ALL_TABLES(对所有表生效)。它们就是严格模式的开关,直接决定了插入或更新失败时是报错还是警告。
至于其他像 NO_ZERO_DATE(禁止‘0000-00-00’日期)、ERROR_FOR_DIVISION_BY_ZERO(除零报错)这些,同样属于更严格的校验规则。要不要一并去掉,就得看你的业务逻辑对这类数据有多大的容忍度了。
如果你只是想快速验证一下,调整 sql_mode 后老应用是否能跑起来,那么临时修改是最佳选择。这种方式只影响当前的数据库连接,一旦断开或重启就会失效。
具体怎么改?这里提供几种常见思路:
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = '';
需要警惕的是,SET SESSION 只对你自己的连接有效,管不了别人。而且,如果数据库本身有全局限制(比如某些云服务商锁定了该参数),这个方法也会失效。
确认临时修改有效,并且你决定长期采用宽松模式后,就可以考虑永久性调整了。这才是解决问题的根本所在。
最经典的方法是修改 MySQL 的配置文件。找到你的配置文件(通常是 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf),在 [mysqld] 这个段落下,添加或修改一行:
sql_mode = "NO_ENGINE_SUBSTITUTION"
当然,你也可以按需组合其他非严苛的规则,例如:
sql_mode = "ONLY_FULL_GROUP_BY,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
保存文件后,重启 MySQL 服务让配置生效:
sudo systemctl restart mysql
(如果你的服务名是 mysqld,则对应修改)。
如果你的 MySQL 版本是 8.0.11 或更高,并且支持动态系统变量,还有一个更优雅的方式——无需重启:
SET PERSIST sql_mode = 'NO_ENGINE_SUBSTITUTION';
这条命令会将设置持久化到 mysqld-auto.cnf 文件中,即使服务器重启,配置也会保留。
最后,有两个特别容易踩坑的地方值得注意:第一,对于阿里云 RDS、腾讯云 CDB 这类云数据库,直接在服务器上修改配置文件通常是行不通的,必须通过云服务商提供的控制台,在“参数设置”或“参数模板”中进行调整。第二,如果你用的是 Docker 运行的 MySQL 容器,务必确保修改的是挂载到容器内部的配置文件,并且容器内的 MySQL 进程能正确读取到它。只改宿主机上的文件,是不会有任何效果的。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述