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
CHANGElanguage
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”)