2012-03-07 18 views
1

私はデータベースを修正し、いくつかのテーブルを修正するためのスクリプトを用意しています。たとえば、これは正常に動作します:BashスクリプトのSQL構文エラー

のmysql -u $ U -p $ P -D $ D < < <は、 'TABLE xyz_tablename DROP columnnameをALTER;'

私は本当にSQLのエースので、私はこの1つを修正するかどうかはわかりませんし、私がしようとしたとき、私は構文エラーに実行していないんだけど、この

の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)キャラクタ・セットUTF8のCOLLATE utf8_general_ci、NOT NULL DEFAULT ''

答えて

4

問題は、SQLということです文は一重引用符を含み、一重引用符で囲みます。これは、引用符で囲まれた文字列がどこで終了し、新しい文字列が始まるかをシェルに混乱させます。

これを試してみてください:

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

-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

+0

+1(文字のエスケープ)とmysql(およびその他のRDBMS)固有のメソッドの両方を提供するために+1します。一番上のオプションは、私がこれまで使用してきたRDBMSでも同様に動作し、ほぼすべてのプログラミング言語で同じ問題を解決します。一番下のものはいくつかの状況で使いやすいです – Karl

+0

@ l0b0、私には恥ずかしい、あなたは正しい。時々私はこの側面ではperlとシェルが異なることを忘れています –

0

あなたはbashで、単一引用符内の単一引用符を持つことはできません。