mysql严格模式必须在phpenv的my.ini中配置并重启服务才生效:路径为c:\programdata\mysql\mysql server x.x\my.ini,需在[mysqld]下添加sql_mode="strict_trans_tables,no_zero_in_date,no_zero_date,error_for_division_by_zero,no_engine_substitution",然后重启mysql服务并用select @@global.sql_mode;验证。

phpEnv 里 MySQL 严格模式不能靠 PHP 配置文件(如 config/database.php)生效,必须改 MySQL 自身的 my.ini 并重启服务 —— 因为 phpEnv 启动的是独立 Windows 版 MySQL 实例,所有客户端连接都共享同一套全局 SQL Mode。
怎么找到 phpEnv 的 my.ini 文件
phpEnv 默认不把 my.ini 放在 MySQL 安装根目录,而是在系统隐藏路径:C:\ProgramData\MySQL\MySQL Server X.X\my.ini(X.X 是版本号,如 8.0 或 5.7)。这个目录默认不可见,需手动开启「显示隐藏的项目」,或直接在文件资源管理器地址栏粘贴完整路径访问。若找不到,可在 phpEnv 主界面点击「MySQL」→「配置文件」,它通常会自动打开正确位置的 my.ini。
修改 my.ini 启用 STRICT_TRANS_TABLES
在 [mysqld] 段下添加或修改 sql_mode 行,不要删掉已有值,只追加严格规则:
- 推荐写法:
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" - 别用
STRICT_ALL_TABLES:它对 MyISAM 表也强制校验,而 phpEnv 常带的系统表(如mysql.help_topic)是 MyISAM,启用后可能导致 MySQL 启动失败 - 别写成
sql-mode = ...:Windows 下 phpEnv 的 MySQL 只认sql_mode(下划线),写错名会导致整行被忽略 - 引号必须是英文双引号,且整个值不能换行
重启 MySQL 服务并验证是否生效
改完保存 my.ini 后,必须重启 phpEnv 的 MySQL 服务(不是 Apache 或 PHP):
- 在 phpEnv 控制面板中点「MySQL」→「重启」,或右键托盘图标选择「Restart MySQL」
- 重启后,用 phpEnv 自带的 MySQL 客户端或命令行连进去执行:
SELECT @@global.sql_mode; - 输出中必须包含
STRICT_TRANS_TABLES,且不能有NO_AUTO_CREATE_USER(MySQL 8.0+ 已移除,写了会报错启动失败) - 注意:
SELECT @@sql_mode;查的是当前会话值,可能被 PDO/Laravel 覆盖;@@global.sql_mode才反映真实持久化配置
为什么 Laravel 的 'strict' => true 在 phpEnv 里经常失效
因为 Laravel 在连接时执行的 SET sql_mode = 'STRICT_TRANS_TABLES' 会被 MySQL 服务器拒绝 —— 如果 my.ini 里没配好,MySQL 启动时会加载空或受限的 sql_mode,后续客户端的 SET 操作在某些版本(尤其是 5.7+)上默认被禁用,且不报错。更麻烦的是,phpEnv 的 MySQL 服务常以 skip-grant-tables 或低权限方式运行,进一步限制运行时修改。
所以最稳的方式只有一条:把 sql_mode 写死在 my.ini 里,让所有连接从一开始就走严格校验。否则你看到的「插入 null 成功」或「超长字符串被截断无提示」,大概率不是代码问题,而是 my.ini 没改对、没重启、或重启后 @@global.sql_mode 根本没变。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











