2012-03-07 75 views
1

我正在修復一個數據庫,並有一個腳本來糾正幾個表。例如,這工作得很好:在Bash腳本中的SQL語法錯誤

的mysql -u $ U -p $ P $ -D d < < < 'ALTER TABLE xyz_tablename DROP columnname;'

我不是一個真正的SQL王牌所以我不知道如何解決這個問題之一,我遇到一個語法錯誤,當我嘗試這個

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

這個SQL語句工作正常:

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

回答

4

的問題是,你的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之後的單引號保持不變。

+0

我想這不是簡單的我錯過了。我曾嘗試雙引號,但處於錯誤的位置。乾杯... – markwk 2012-03-07 11:49:03

-2

您必須使用"

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 '';" 
+0

嗯,沒有。在Bash中沒有辦法將單引號放入單引號字符串中。 – l0b0 2012-03-07 09:56:01

+0

+1用於提供泛型anwser(轉義字符)和mysql(以及其他一些RDBMS)特定的方法來解決此問題(混合引用類型)。頂級選項可以用在任何我曾經使用的RDBMS中,也可以作爲幾乎所有編程語言中同樣問題的解決方案。底部的一個很容易在某些情況下使用 – Karl 2012-03-07 09:59:07

+0

@ l0b0,對我感到羞恥,你是對的。有時候我忘記perl和shell在這方面有所不同 – 2012-03-07 10:21:52

0

你不能讓bash單引號內的單引號。