Shell脚本中MySQL跨表插入报1064错误,请求排查语法问题
问题排查与解决
- SQL语句未被整体包裹:
mysql -e后的SQL语句必须用引号整体包裹,否则Shell会把SQL里的空格当成命令参数分隔符,导致mysql接收到不完整的SQL片段,触发1064语法错误。 - 表名拼接的引号问题:原命令中
"$cpuser"_mysql.db的双引号只包裹了$cpuser,Shell展开后可能导致表名格式异常,无法被MySQL正确识别。
修正后的命令
将整个SQL语句用双引号包裹,同时用反引号包裹拼接后的数据库名(符合MySQL标识符规范,避免特殊字符干扰):
mysql -e "INSERT INTO mysql.db SELECT * FROM \`${cpuser}_mysql\`.db;"
或者用单引号拼接的方式(确保变量能被Shell正常展开):
mysql -e 'INSERT INTO mysql.db SELECT * FROM `'"$cpuser"'_mysql`.db;'
补充说明
如果$cpuser的值包含横线、数字开头这类特殊字符,用反引号`包裹数据库名是必须的,否则MySQL会将其识别为语法错误。同时建议脚本中对$cpuser变量做简单校验,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者lukederbyshire
相关产品推荐
相关产品推荐

