mysql报错1064主因是sql未通过解析器校验,常见原因包括:①关键字拼写错误;②引号、括号、逗号或分号缺失/冗余;③保留字未用反引号包裹;④客户端未启用多语句模式或分号后含空格/注释;⑤版本兼容性问题及动态标识符误用%s占位符。
能,但必须满足三个硬性条件:连接类型是 mysql/mariadb、已启用「允许执行多个查询」、每条语句结尾的 ; 不能带空格或注释。
为什么写了分号还报 error 1064?
Navicat 默认把整个查询窗口当一条语句处理,根本没尝试按 ; 切分——这不是你 SQL 写错了,而是客户端压根没开多语句模式。
- Windows/macOS:右键连接 → 编辑连接 → 「高级」选项卡 → 勾选
允许执行多个查询 - 勾选后必须重新连接,已打开的查询窗口不会自动生效
- PostgreSQL / SQL Server / Oracle 连接下该选项不可见,此功能仅对 MySQL 和 MariaDB 生效
分号位置稍有偏差就会静默失败
Navicat 不是 SQL 解析器,它靠字符串匹配切分语句,对 ; 后面的字符极其敏感。
- ✅ 正确:
SELECT * FROM users;、UPDATE logs SET status=1; - ❌ 错误:
SELECT * FROM users; -- 注释(部分版本会把注释连;一起截断) - ❌ 错误:
INSERT INTO t VALUES (1); \n(末尾换行或空格可能被判定为语句未结束) - 存储过程定义中含
;时,必须先用DELIMITER $$切换分隔符,否则会在第一个;处提前截断
执行结果只显示最后一条 SELECT,其他都藏在「消息」面板里
你粘了 10 条语句,只有最后那个 SELECT 的结果集会出现在结果页;前面的 INSERT 影响行数、UPDATE 匹配数、中间报错信息,全得点开底部的「消息」面板手动翻。
- 如果某条语句失败(比如
DROP TABLE表不存在),后续语句是否继续执行,取决于 MySQL 服务端配置,Navicat 本身不控制事务粒度 - 想让失败后继续跑,得在 SQL 文件里用
INSERT IGNORE或ON DUPLICATE KEY UPDATE替代裸INSERT - 批量执行多个
.sql文件时,不是用 Ctrl+Shift+Q,而是右键连接 →运行SQL 文件,再 Ctrl 多选
最常被忽略的其实是连接重连这一步——改完高级设置不重启连接,所有分号都白写。










