从 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 脚本时,空格会更改分隔符的主要内容,如果未能解决你的问题,请参考以下文章

如何从输出到前景的Bash脚本运行无限循环

linux shell脚本有编译器吗?每次都是运行后提示很多错误啊,能在编写的时候提示错误吗?

Centos7 Shell脚本提示参数太多

如何从需要SUDO的php调用shell脚本?

如何实现在运行shell程序时添加选项-h能提示程序的用法?

如何从需要 SUDO 的 php 调用 shell 脚本?