从shell /命令提示符运行MySQL脚本时,空格会更改定界符

Hoo*_*ini 6 mysql linux ubuntu mysql-workbench

MySQL innodb version 5.7.10 'MySQL Community Server (GPL)'在Windows计算机上使用。如果从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 ;
Run Code Online (Sandbox Code Playgroud)

但是,如果将脚本复制到schema.sql并从Windows命令提示符运行它:

mysql> c:\release\ver1\schema.sql
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

您的SQL语法有误;查看与您的MySQL服务器版本相对应的手册,以获取在'DELIMITER //附近使用的正确语法//

此错误是由于制表符字符引起的,如果我删除了制表符,它将运行正常。

我也尝试从Linux shell(MyQSL innodb version 5.7.25)运行它,并得到相同的错误:

mysql> source /home/ubuntu/release/ver1/schema.sql
Run Code Online (Sandbox Code Playgroud)

注意:我尝试用几个空格字符替换tab char(\t),并且空格很好。。。只有tab char改变了定界符。


我在开发环境中使用MySQL Workbench,但在测试和生产环境中,我仅使用Linux Shell中的MySQL ...这个错误已经引起我很多次了,因为通过开发环境的脚本在测试中失败而且每次我都必须记得回去并从脚本中删除选项卡时。

无论如何有解决此问题或配置MySQL忽略选项卡字符?

Chi*_*ata 1

有一些程序(例如GrepWin)可以轻松替换文件中的字符。但是,如果您想要自动化的东西,我建议您设置一个Webhook并使用一个命令来替换所有选项卡,如下所示,每次推送架构时执行。

sed -i.bak $'s/\t*//g' schema.sql
Run Code Online (Sandbox Code Playgroud)