确认phpenv启用严格模式需执行select @@sql_mode;若含strict_trans_tables或strict_all_tables即开启。永久关闭应修改c:\phpenv\mysql\my.ini的[mysqld]段,设sql_mode="no_engine_substitution,no_zero_date,no_zero_in_date,error_for_division_by_zero"并重启mysql服务;临时关闭可在php连接后执行set session sql_mode='no_engine_substitution'。

phpEnv 是 Windows 下轻量级 PHP 本地环境,它默认使用 MySQL 5.7+ 或 8.0+,而这些版本开启 STRICT_TRANS_TABLES 是常态——这意味着插入空字符串到 DECIMAL、INT 字段,或写入超长 VARCHAR 值时会直接报错,而不是静默截断。关掉严格模式不是“妥协”,而是匹配老项目或快速开发阶段的实际需求。
怎么确认 phpEnv 当前启用了严格模式
打开 phpEnv 自带的 MySQL 客户端(或用命令行进入 mysql -u root -p),执行:
SELECT @@sql_mode;
如果返回结果里包含 STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES,就确认开启了。phpEnv 的 MySQL 通常没改过默认配置,基本 100% 有这两个值。
修改 my.ini 永久关闭(推荐,但必须重启 mysqld)
phpEnv 的 MySQL 配置文件是 my.ini,路径一般为:C:\phpEnv\mysql\my.ini(具体看你的安装目录)。用记事本打开,在 [mysqld] 段落末尾添加或修改这一行:
sql_mode = "NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
注意以下几点:
- 不要写成
sql_mode = ""或sql_mode = ''—— MySQL 会 fallback 到内置默认值,其中就含 STRICT - 不要只保留
NO_ENGINE_SUBSTITUTION—— 它本身不排斥 STRICT,必须显式排除 - 改完保存后,必须在 phpEnv 控制面板里「停止 MySQL」再「启动 MySQL」,不是重启 Apache
- 如果找不到
[mysqld]段落,就把这行加在文件最底部,它会自动归属到默认服务段
PHP 运行时临时禁用(适合调试,不持久)
如果你只是想让某个 Laravel/ThinkPHP 项目跑起来,又不想动全局配置,可以在数据库连接建立后立刻执行:
$pdo->exec("SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'");
或者用 mysqli:
mysqli_query($conn, "SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'");
关键限制:
- 每次新连接都要重设,HTTP 请求结束即失效
- Laravel 用户需在
config/database.php的mysql连接配置里加'options' => [PDO::ATTR_INIT_COMMAND => "SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'"] - 不能解决建表语句里的严格校验(如
CREATE TABLE中定义了NOT NULL却没给默认值),这类问题仍需改 SQL
为什么 SET GLOBAL 不适用于 phpEnv
你可能看到网上教用 SET GLOBAL sql_mode = '',但在 phpEnv 场景下基本无效:
- phpEnv 默认以 Windows 服务方式运行 mysqld,普通用户权限无法执行
GLOBAL级别变更 - 即使成功,下次 phpEnv 重启 MySQL 服务时,配置仍会回到
my.ini所定义的值 -
SET GLOBAL要求 SUPER 权限,而 phpEnv 的 root 用户常被限制(尤其新版)
真正起效的只有改 my.ini + 重启服务,或每个连接手动 SET SESSION。别在 phpEnv 里浪费时间试 SET GLOBAL——它看起来快,实则不可靠。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











