带有破折号的MySQL模式名称不允许我执行命令行查询

时间:2015-03-26 09:54:39

标签: mysql bash shell vagrant

我创建了一个shell脚本来自动化从主机到主机的数据库迁移,它将我的Multi WordPress站点表提取到单独的sql文件中,这样我就可以决定每次迁移哪个站点。

所以在我的shell脚本中,我有以下代码:

schema="internet-safe"
PROJECT_FOLDER_NAME="internet-safe"
vagrant_export_folder="/var/www/projects/${PROJECT_FOLDER_NAME}/database/tmp"

query="mysql -uroot -proot -e \"SELECT blog_id AS ID, path AS Slug FROM ${schema}.wp_blogs "
query="$query INTO OUTFILE '$vagrant_export_folder/blogs.csv' "
query="$query FIELDS TERMINATED BY ',' "
query="$query ENCLOSED BY '\\\"' "
query="$query LINES TERMINATED BY '\n' \" > /dev/null"

vagrant ssh --command "cd $vagrant_export_folder && $query"

但是通过执行此脚本,我收到以下错误:

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 '-safe.wp_blogs  INTO OUTFILE '/var/www/projects/internet-safe/database/tmp/blogs' at line 1

关闭127.0.0.1的连接。

问题是架构名称internet-safe中的破折号。有没有办法纠正这个问题?

我知道有一个选项,只是重命名架构,但不幸的是我在xUbuntu上运行不稳定的流浪汉,它已经多次破坏我的数据库,而我尝试在我的数据库中配置修改。

我也尝试了以下组合,但收到如下错误消息:

`${schema}`.`wp_blogs`


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 'INTO OUTFILE '/var/www/projects/internet-safe/database/tmp/blogs.csv'  FIELDS TE' at line 1


`${schema}`.wp_blogs


ERROR 1046 (3D000) at line 1: No database selected



`${schema}.wp_blogs`


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 'INTO OUTFILE '/var/www/projects/internet-safe/database/tmp/blogs.csv'  FIELDS TE' at line 1

1 个答案:

答案 0 :(得分:1)

最佳选择当然是简单地重命名数据库。

通常,当架构/表/列名称中出现特殊字符时,您可以使用反引号修复此问题。因为你试图运行一个shell脚本,不幸的是它会将反引号中的任何内容解释为命令。

在MySQL中,您可以设置sql_mode“ANSI_QUOTES”。使用

以管理员/ root(在MySQL中)执行此操作
mysql> SET GLOBAL sql_mode="ANSI_QUOTES";

如果您已经使用

设置了任何模式,请先检查
mysql> SHOW VARIABLES LIKE 'sql_mode';

如果已经设置了模式,请在SET GLOBAL sql_mode语句中包含这些模式(由,分隔)。

您也可以在my.cnf文件中设置此选项,以便每次启动MySQL服务器时都应用此模式。

效果是,"也被允许作为标识符引用字符。但请注意,您不要在查询中使用"来指定任何文本,而是使用单引号。