【发布时间】:2020-03-13 08:37:55
【问题描述】:
我在 Windows 机器上使用MySQL innodb version 5.7.10 'MySQL Community Server (GPL)'。如果我从 MySQL Workbench 运行以下脚本,它运行良好:
DROP PROCEDURE IF EXISTS procedure1;
DELIMITER //
CREATE PROCEDURE procedure1(IN pageSize BIGINT)
BEGIN
SELECT * FROM table1 LIMIT pageSize;
END //
DELIMITER ; -- note that there is an extra tab char here
DROP PROCEDURE IF EXISTS procedure2;
DELIMITER //
CREATE PROCEDURE procedure2()
BEGIN
SELECT * FROM table2;
END //
DELIMITER ;
但如果将脚本复制到 schema.sql 并从 Windows 命令提示符运行它:
mysql> c:\release\ver1\schema.sql
我收到以下错误:
您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 'DELIMITER //
附近
这个错误是因为标签字符,如果我删除标签,它会运行良好。
我也尝试从 Linux shell (MyQSL innodb version 5.7.25) 运行它,我得到了同样的错误:
mysql> source /home/ubuntu/release/ver1/schema.sql
注意:我尝试将 tab 字符 (\t) 替换为几个 空格 字符,并且空格很好。 . 它只是改变分隔符的制表符。
我在开发环境中使用 MySQL Workbench,但对于测试和生产环境,我只是在 Linux Shell 中使用 MySQL...这个错误已经抓住了我很多次,因为已经通过开发环境的脚本,测试失败,每次我必须记得返回并从脚本中删除选项卡。
有没有办法解决这个问题或将 MySQL 配置为忽略 tab char?
【问题讨论】:
-
您能否将所有(两个)丢弃过程调用移到前面以避免额外的分隔符更改?我看到您在
//分隔符中也有一个空格,但它是平衡的,也在 END... -
您是否尝试在 Windows 上像在 linux 上一样执行脚本?只是看看,如果有什么不同。
-
@PaulSpiegel:感谢您的建议,我已经在 Windows 命令提示符下进行了测试,我得到了同样的错误。另外我注意到只有制表符会导致这个问题,空格很好。我已经更新了问题。
-
只是好奇:如果在
DROP PROCEDURE IF EXISTS procedure2;之后添加标签会发生什么 -
所以不使用 TAB 是解决方案吗?也许您应该配置 Workbench 以将制表符转换为空格(在编辑器中)。任何 IDE 都应该有这个设置。工作台也应该有一个导出功能,会生成一个“干净”的脚本。
标签: mysql linux ubuntu mysql-workbench