1

我有一个自定义的 mysql 备份脚本,该脚本的一部分应该执行这样的语句(打算删除 .gz):

mysql -uroot -pmypass -e "CREATE DATABASE IF NOT EXISTS `basename -s .gz test-db.gz`" 

但它不起作用并产生错误:

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-db' at line 1

我知道问题出在分隔 test 和 db 的连字符“-”上。

这个声明有效

mysql -uroot -pmypass -e "CREATE DATABASE IF NOT EXISTS \`test-db.gz\`"

那么,如何使上述语句正常工作,包括我需要的命令替换?

4

1 回答 1

4

其背后的原因是 mysql 不允许您创建名称包含连字符的数据库。解决方法是用在 MYSQL 中具有特殊含义的反引号将数据库名称括起来以转义保留字。

反引号在用于命令替换的 shell 中还有另一个含义,因此在这种情况下,我们需要对命令或嵌套反引号使用 $() 表示法,我个人更喜欢前者,因为它更具可读性并且还由于反引号在 2013 年被弃用以支持 $() 语法的事实。

我设法重现了您所面临的问题,并且以下命令对我来说很好。在这里,我们正在转义反引号,以便 shell 不会将它们解释为命令替换,而 mysql 仍将它们用作指示符来转义“test-db”中的“-”

mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS \`$(basename -s .gz test-db.gz)\`"

或者

mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS \``basename -s .gz test-db.gz`\`"

但是,如果稍后您需要删除该数据库或对其执行任何数据库级操作,则需要用反引号将数据库名称括起来,例如

drop database `test-db`;

这是mysql 中关于数据库名称中包含连字符的错误的链接

于 2013-08-25T22:21:21.480 回答