Bash 脚本中的 SQL 语法错误

Posted

技术标签:

【中文标题】Bash 脚本中的 SQL 语法错误【英文标题】:SQL Syntax error in Bash Script 【发布时间】:2012-03-24 20:08:41 【问题描述】:

我正在修复一个数据库并有一个用于更正几个表的脚本。例如,这很好用:

mysql -u $U -p$P -D$D xyz_tablename DROP columnname ;'

我并不是真正的 SQL 高手,所以我不确定如何解决这个问题,并且在尝试此操作时遇到了语法错误

mysql -u $U -p$P -D$D drupal_url_alias CHANGE language language VARCHAR(12) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '';'

这条 SQL 语句运行良好:

ALTER TABLE drupal_url_alias CHANGE language language VARCHAR(12) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''

【问题讨论】:

【参考方案1】:

问题是你的SQL语句包含单引号,并且放在单引号中。这会使 shell 混淆一个引用字符串的结束位置和一个新字符串的开始位置。

试试这个:

mysql -u $U -p$P -D$D <<< "ALTER TABLE drupal_url_alias CHANGE language language VARCHAR( 12 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '';"

我已将声明放在双引号中。请注意,双引号不等同于单引号(例如,变量插值发生在双引号中,但不在单引号中),但在您的特定情况下,唯一的区别是 DEFAULT 之后的单引号保持不变。

【讨论】:

我想这不是我缺少的简单的东西。我试过双引号,但位置错误。干杯...【参考方案2】:

在 Bash 中,单引号内不能有单引号。

【讨论】:

【参考方案3】:

你必须使用":

mysql -u $U -p$P -D$D <<< "ALTER TABLE drupal_url_alias CHANGE language language VARCHAR( 12 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '';"

【讨论】:

嗯,没有。在 Bash 中,无法将单引号放在单引号字符串中。 +1 用于提供通用 anwser(转义字符)和 mysql(以及其他一些 RDBMS)特定方法来解决此问题(混合引用类型)。最佳选项将适用于我曾经使用过的任何 RDBMS,并且可以作为几乎所有编程语言中相同问题的解决方案。底部的在某些情况下很容易使用 @l0b0,真丢脸,你是对的。有时我忘记了 perl 和 shell 在这方面的不同

以上是关于Bash 脚本中的 SQL 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

语法错误:bash 脚本中的“fi”意外(预期“then”)

Bash 脚本中意外标记“if”附近的语法错误

Bash 语法错误

函数内部 sed 命令中的 bash 语法错误,在命令行上工作正常

Bash 脚本:意外标记附近的语法错误?

用于验证 sql 语法错误的 Powershell 脚本