mysql错误1235(er_not_supported_yet)根本原因是旧版mysql(5.7.0前、8.0.19前)不支持limit与in/all/any/some子查询组合,phpenv默认集成的5.5/5.6等版本必然触发;解决路径包括sql改写(派生表套层或join替代)或手动升级至mysql 8.0.19+并正确配置服务。

MySQL 1235 错误(ERROR 1235 (ER_NOT_SUPPORTED_YET))在 phpEnv 环境中高频出现,根本原因不是 phpEnv 本身的问题,而是它默认集成的 MySQL 版本较老(如 5.5、5.6 或早期 5.7),而这些版本不支持 LIMIT 直接出现在 IN/ANY/ALL 子查询中。你改 SQL 就能跑通,但若想一劳永逸,得从 phpEnv 的组件选型和配置入手。
phpEnv 中 MySQL 版本决定是否触发 1235 错误
phpEnv 是 Windows 下的本地 PHP 环境套件,其 MySQL 组件由用户手动选择安装。关键事实是:
- MySQL 5.7.0 之前 和 8.0.19 之前 均不支持
SELECT * FROM t1 WHERE id IN (SELECT id FROM t2 LIMIT 10)这类写法 - phpEnv 官方打包的「经典组合」(如 PHP 7.2 + MySQL 5.5)几乎必然触发该错误
- MySQL 8.0.19+ 已修复此限制,但 phpEnv 默认不提供 8.0.19+ 的一键安装包(截至 2026 年 4 月)
- 即使你手动替换了 MySQL 文件夹,若未重置服务注册、data 目录权限或 my.ini 配置,仍可能启动失败或行为异常
绕过 1235 错误的两种实操路径
不升级 MySQL 也能解决,但要注意适用场景和副作用:
路径一:子查询套一层(最常用)
把带 LIMIT 的子查询包进一个派生表(derived table),并显式命名别名(AS xxx 不可省):
SELECT * FROM product_sale
WHERE pro_id IN (
SELECT t.pro_id FROM (
SELECT pro_id FROM product ORDER BY created_at DESC LIMIT 5
) AS t
);
⚠️ 注意:AS t 必须存在,否则 MySQL 仍报 1235;别名不能是保留字(如 as、order);嵌套层级不宜超过 3 层,否则可读性和优化器识别度下降。
路径二:改用 JOIN(适合 UPDATE/DELETE 场景)
尤其对 UPDATE ... WHERE id IN (SELECT ... LIMIT N) 类语句,JOIN 更安全高效:
UPDATE product_sale ps JOIN ( SELECT pro_id FROM product ORDER BY created_at DESC LIMIT 5 ) AS p ON ps.pro_id = p.pro_id SET ps.sale_count = ps.sale_count + 1;
✅ 优势:避免子查询相关限制,MySQL 优化器更容易命中索引;✅ UPDATE 时不会因子查询被缓存导致意外交互;❌ 缺点:语法稍长,逻辑上需确保关联字段无 NULL 或重复值干扰。
phpEnv 升级 MySQL 的实操要点
若坚持升级到 8.0.19+ 来根治问题,必须手工操作,且以下步骤缺一不可:
- 从 MySQL 官网 下载
mysql-8.0.33-winx64.zip(推荐 LTS 版本,非最新 RC) - 停止 phpEnv 中的 MySQL 服务(右键托盘图标 → Stop MySQL)
- 备份原
phpenv\mysql\目录,再清空该文件夹 - 解压新版 MySQL 到
phpenv\mysql\,复制原my.ini(注意检查basedir、datadir路径是否仍指向phpenv\mysql\data) - 以管理员身份运行 CMD,执行:
phpenv\mysql\bin\mysqld --initialize-insecure --user=mysql(仅首次初始化;若 data 目录已存在且有效,跳过此步) - 重新注册服务:
phpenv\mysql\bin\mysqld --install MySQL --defaults-file="phpenv\mysql\my.ini" - 启动服务并用
mysql -u root -p测试(初始密码为空,可后续用ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxx';设置)
⚠️ 最容易被忽略的一点:phpEnv 的控制面板可能仍显示旧版本号(如 “MySQL 5.6”),但它实际运行的是你装的新版 —— 请以 SELECT VERSION(); 查询结果为准。控制面板信息不更新不影响功能,但会误导判断。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











