phpenv 中关闭 mysql 严格模式需手动修改 my.ini 并重启 mysql 服务;执行 mysql -u root -p -e "select @@sql_mode;" 查看是否含 strict,修改 sql_mode = "no_engine_substitution,no_zero_date,no_zero_in_date,error_for_division_by_zero" 后必须通过控制面板重启 mysql。

phpEnv 是 Windows 下轻量级 PHP 开发环境,自带 MySQL(通常为 5.7 或 8.0),但**不提供图形化配置界面**,关闭严格模式必须手动改配置文件并重启服务——这点和 XAMPP/WAMP 不同,容易误以为“点一下就能关”。
确认当前 MySQL 是否启用了严格模式
打开命令行,进入 phpEnv 安装目录下的 MySQL\bin,执行:
mysql -u root -p -e "SELECT @@sql_mode;"
如果输出中包含 STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES,说明严格模式已启用。注意:phpEnv 默认沿用 MySQL 官方 5.7+ 行为,基本都带前者。
修改 my.ini 配置文件(唯一持久生效方式)
phpEnv 的 MySQL 配置文件是 my.ini,不是 my.cnf,路径固定在:
phpEnv\MySQL\my.ini
用记事本或 VS Code 打开,在 [mysqld] 段落下方添加或修改这一行:
sql_mode = "NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
- 不要写成
sql_mode = ""—— MySQL 会 fallback 到内置默认值,仍含 STRICT - 不要只保留
NO_ENGINE_SUBSTITUTION—— 它本身不含 STRICT,但单独使用可能引发日期/除零等隐式转换问题 - 别漏掉引号,Windows 下无引号会导致解析失败
- 改完保存后,必须通过
phpEnv控制面板「重启 MySQL」,不是只重启 Apache
临时绕过(仅限调试,不适用于生产逻辑)
如果你只是想快速验证某段 PHP 代码能否跑通(比如老项目插入空字符串到 DECIMAL 字段),可在 PDO 连接建立后立即执行:
$pdo->exec("SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'");
但要注意:
- 每次
new PDO()都得重设,无法靠连接池复用 - Laravel 用户需在
config/database.php的options中加PDO::ATTR_INIT_COMMAND,否则 Eloquent 查询前不会触发 - 此方式对
mysqli同样有效:mysqli_query($conn, "SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'");
最常被忽略的一点:改完 my.ini 后没重启 MySQL 服务,或者重启了 Apache 就以为生效——phpEnv 的 MySQL 是独立进程,必须单独重启。另外,部分旧版 phpEnv 自带的 MySQL 二进制不支持 sql_mode 全量覆盖,若启动失败,回退到只保留 NO_ENGINE_SUBSTITUTION 即可。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











