MySQL 8.0+默认启用严格模式,但phpMyAdmin可能绕过,需在mysqld.cnf中持久化配置sql_mode(如STRICT_TRANS_TABLES,NO_ZERO_DATE等),并移除ONLY_FULL_GROUP_BY;重启MySQL后,通过插入超长字符串或零日期验证是否报错而非静默截断。
MySQL 8.0+ 默认已启用严格模式,但 phpMyAdmin 可能绕过它
phpmyadmin 的“插入”表单提交走的是 insert into ... values 语句,但若服务端 sql 模式未显式约束,mysql 仍可能接受截断的字符串或零日期(如 '0000-00-00')。关键不在 phpmyadmin 配置,而在 mysql 实例的 sql_mode 是否真正生效。
- 检查当前模式:
SELECT @@sql_mode;,确认包含STRICT_TRANS_TABLES或STRICT_ALL_TABLES - 仅靠 phpMyAdmin 的“设置 → MySQL 系统变量”界面修改是临时的、会话级的,重启后失效
- 必须在 MySQL 配置文件(如
/etc/mysql/mysql.conf.d/mysqld.cnf)的[mysqld]段落中持久化设置
如何安全地设置 sql_mode(避免 phpMyAdmin 报错或插入失败)
直接设成 STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 是常见做法,但要注意:phpMyAdmin 自身某些内部查询(比如统计表行数时用到的临时视图)可能依赖宽松模式。硬切容易导致界面报错 #1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause 等。
- 推荐组合:
STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION—— 用STRICT_TRANS_TABLES而非STRICT_ALL_TABLES,对事务表严格,对 MyISAM 等非事务表留余地 - 务必移除
ONLY_FULL_GROUP_BY,否则 phpMyAdmin 的很多聚合查询会失败(它生成的 SQL 不总符合该规则) - 修改配置后必须重启 MySQL:
sudo systemctl restart mysql,仅重载配置(mysqladmin reload)不生效
验证是否生效:从 phpMyAdmin 插入时看错误类型
配置生效后,phpMyAdmin 提交超长字符串或非法日期时,不再静默截断或转成零值,而是抛出明确错误。这是唯一可信的验证方式。
- 测试截断:向
VARCHAR(5)字段插入'hello world'→ 应报错Out of range value for column 'xxx' at row 1,而非存入'hello' - 测试零日期:插入
'0000-00-00'到DATE字段 → 应报错Incorrect date value: '0000-00-00',而非存入该值或转成NULL - 注意:phpMyAdmin 的“快速 insert”(小加号按钮)有时缓存旧模式,建议用“插入”标签页完整表单提交来测
PHP 层也要配合:mysqli 和 PDO 默认不触发严格模式错误
即使 MySQL 服务端开了严格模式,PHP 的 MySQL 扩展默认把警告当普通提示,mysqli_query() 仍返回 true,错误被吞掉。这会让业务逻辑误判插入成功。
- mysqli:连接后立即执行
mysqli_query($conn, "SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_DATE,...'");,或在mysqli_real_connect()的flags中加MYSQLI_CLIENT_FOUND_ROWS(辅助判断) - PDO:创建实例时加上
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,否则execute()失败也不抛异常 - 不要依赖
mysql.strict_mode = On这种 PHP.ini 选项——它早已废弃且无效
MySQL 严格模式不是开关一按就完事的事;服务端配置、客户端行为、phpMyAdmin 的 SQL 构造逻辑三者要对齐,漏掉任意一环,截断和零日期就会悄悄溜进来。
立即学习“PHP免费学习笔记(深入)”;



















