从 shell/命令提示符运行 MySQL 脚本时,空格会更改分隔符
Posted
技术标签:
【中文标题】从 shell/命令提示符运行 MySQL 脚本时,空格会更改分隔符【英文标题】:White space changes the delimiter when running MySQL script from the shell/command prompt 【发布时间】: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 都应该有这个设置。工作台也应该有一个导出功能,会生成一个“干净”的脚本。
【参考方案1】:
有像GrepWin 这样的程序可以轻松替换文件中的字符。但是,如果你想要自动化的东西,我建议你设置一个 webhook 并有一个命令来替换所有选项卡,如下所示,每次推送你的架构时都会执行。
sed -i.bak $'s/\t*//g' schema.sql
【讨论】:
以上是关于从 shell/命令提示符运行 MySQL 脚本时,空格会更改分隔符的主要内容,如果未能解决你的问题,请参考以下文章
linux shell脚本有编译器吗?每次都是运行后提示很多错误啊,能在编写的时候提示错误吗?