【问题标题】:SQL Syntax error in Bash ScriptBash 脚本中的 SQL 语法错误
【发布时间】: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 ''

【问题讨论】:

    标签: mysql sql bash


    【解决方案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 在这方面的不同
      猜你喜欢
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多