You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel通过ProxySQL连接MySQL8时报NO_AUTO_CREATE_USER错误求助

解决Laravel通过ProxySQL连接MySQL8时报错1231: Variable 'sql_mode' can't be set to 'NO_AUTO_CREATE_USER'

问题根源

MySQL 8.0 已移除了 NO_AUTO_CREATE_USER 这个sql_mode参数,而ProxySQL可能在会话初始化阶段,自动为Laravel的连接设置了包含该参数的sql_mode,导致MySQL拒绝执行并报错。直接连接MySQL8或Node应用通过ProxySQL连接没问题,是因为前者不会触发ProxySQL的额外变量注入,后者的驱动未触发ProxySQL的会话初始化逻辑。

解决步骤

1. 修正ProxySQL全局sql_mode设置

登录ProxySQL的管理终端(默认端口6032),执行以下命令:

-- 设置符合MySQL8要求的sql_mode,移除NO_AUTO_CREATE_USER
SET mysql-global_variables.sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- 保存配置到磁盘
SAVE MYSQL VARIABLES TO DISK;
-- 加载生效
LOAD MYSQL VARIABLES TO RUNTIME;

2. 检查并修正用户级sql_mode配置

如果ProxySQL为Laravel使用的数据库用户单独配置了sql_mode,需要单独更新:

-- 查看目标用户的配置
SELECT username, variables FROM mysql_users WHERE username='your_laravel_db_user';
-- 如果variables字段包含NO_AUTO_CREATE_USER,执行更新
UPDATE mysql_users 
SET variables='sql_mode=''ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION''' 
WHERE username='your_laravel_db_user';
-- 保存并加载用户配置
SAVE MYSQL USERS TO DISK;
LOAD MYSQL USERS TO RUNTIME;

3. 排查ProxySQL查询规则中的强制sql_mode注入

检查是否有查询规则在连接时自动注入包含NO_AUTO_CREATE_USER的sql_mode:

-- 列出所有查询规则
SELECT rule_id, active, match_pattern, replace_pattern FROM mysql_query_rules;
-- 如果发现有规则注入SET sql_mode=...包含目标参数,删除或修改该规则
DELETE FROM mysql_query_rules WHERE rule_id=XX; -- XX为对应规则ID
-- 保存并加载规则配置
SAVE MYSQL QUERY RULES TO DISK;
LOAD MYSQL QUERY RULES TO RUNTIME;

验证

修改完成后,重启Laravel应用或刷新数据库连接,测试是否还会出现该报错。

内容的提问来源于stack exchange,提问作者Mujtaba Tarar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:17:40