根本原因是DBeaver默认按分号分割语句且不解析DELIMITER指令,导致CREATE PROCEDURE等多语句块被错误截断;必须显式用DELIMITER $$开头、DELIMITER ;结尾,并确保UTF-8编码及统一分隔符。

直接执行 .sql 文件里的存储过程定义会失败
因为 MySQL 的存储过程创建语句(CREATE PROCEDURE)默认以分号 ; 结尾,而 DBeaver 的 SQL 编辑器默认把每个 ; 当作一条独立语句执行——这会导致 DELIMITER 切换失效、语法报错,比如 ERROR 1064 (42000) 或 “unexpected token”。
必须显式告诉 DBeaver:这段脚本里要用别的符号当语句分隔符。常见做法是加 DELIMITER $$ 开头、DELIMITER ; 结尾,中间所有 $$ 才算一个完整语句。
- 打开 SQL 编辑器后,先手动输入
DELIMITER $$(不能漏空格) - 粘贴你的存储过程定义(含
CREATE PROCEDURE ... BEGIN ... END $$) - 最后加一行
DELIMITER ; - 全选(
Ctrl+A),再按Ctrl+Enter执行
Tools → Execute Script 导入大文件时编码和分隔符都得手动管
拖拽或通过 Tools → Execute Script 加载外部 .sql 文件时,DBeaver 不会自动识别 DELIMITER 指令,也不会帮你切分多语句块——它会把整个文件按行或按 ; 硬切,结果就是只执行了第一段,后面全报错。
- 确保文件本身是 UTF-8 编码(右键文件 → Properties → Text file encoding → UTF-8)
- 文件开头必须包含
DELIMITER $$,结尾必须有DELIMITER ; - 避免在脚本里混用
DELIMITER //和DELIMITER $$,DBeaver 只认第一个出现的DELIMITER指令 - 如果脚本含多个存储过程,每个都得用同一套
DELIMITER包裹,不能只包第一个
执行已存在的存储过程,别用 EXEC 或 EXECUTE PROCEDURE
MySQL 不支持 EXEC(那是 SQL Server 的语法),也不接受 EXECUTE PROCEDURE proc_name 这种写法。DBeaver 里调用已有存储过程,就一个最简方式:CALL proc_name()。
- 参数必须用括号包裹,哪怕无参也要写
(),写成CALL proc_name会报错 - 有参数时,字符串要加单引号,比如
CALL get_user_by_id('abc123') - 如果过程有输出参数(
OUT),DBeaver 默认不显示返回值;想看,得配合SELECT @var_name查变量 - 执行后结果集出现在“Result Sets”标签页,不是“Output”或“Messages”
本地没装 mysql-client,Dump database 和 Restore database 功能就不可用
DBeaver 的图形化导出/导入(右键数据库 → Tools → Dump database)底层调用的是 mysqldump 和 mysql 命令。如果本地没装 MySQL 客户端,点“Start”只会卡住或报“Local client not found”。
- Mac 用户:运行
brew install mysql-client,然后在 DBeaver 首选项里手动指定路径(Preferences → Editors → SQL Execution → Local client) - Windows 用户:下载 MySQL Installer,勾选 “MySQL Client” 组件(不用装 Server)
- Linux 用户:用包管理器装
mysql-client(Ubuntu/Debian 是apt install mysql-client) - 装完必须重启 DBeaver,否则识别不到新路径
执行存储过程脚本真正的难点不在语法,而在 DBeaver 对 MySQL 特有语句分隔机制的“零容忍”——它不会帮你猜意图,DELIMITER 写错位置、少写结尾、文件编码不对,三者任一出问题,都会静默失败或只执行前半截。










