2017-01-20 11 views
1

非常に長い単語のリストを含むテキストファイルを読み込み、さらに分析するために、それらの長さと長さをデータベースに挿入しようとしています。bash、bash内のSQLステートメント内でアポストロフィをエスケープする

スクリプトは、アポストロフィで単語に達するまで機能します。私は現在持っていることは次のとおりです。

#!/bin/bash 
inputfile="words.txt" 
cat $inputfile | while read word; do 
    echo "INSERT INTO words (word, word_size) VALUES ('$word', CHAR_LENGTH('$word'));" 
done | mysql -u root -p crossword 

指定されたエラーは次のとおりです。

ERROR 1064 (42000) at line 170: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's', CHAR_LENGTH('abbey's'))' at line 1 
+2

オペレーション。 – chepner

+0

さて、私はPHPを使用することができましたが、そのような小さなものを一度だけ使用することはできますが、単語の大量のリスト(800kワード)で高速化することはありませんか? –

+0

まず、pipeとmysqlコマンドを削除して、SQL文を標準出力にエコーしてください。そして、どのSQL文が失敗したのか(全部または一部のみ)を識別し、その文を手動でデバッグするために、コマンド行で手動で各SQL文を実行します(適切に引用します)。生成したSQL文が何か問題があることがわかったら、それを把握できない場合にスクリプトをどのように入れるのかを尋ねることができます。 – Fred

答えて

0

はmysqlで'''をエスケープする必要があります。これを試してみてください:

#!/bin/bash 
inputfile="words.txt" 
cat $inputfile | while read word; do 
    echo "INSERT INTO words (word, word_size) VALUES (\"${word/\'/''}\", CHAR_LENGTH(\"${word/\'/''}\"));" 
done | mysql -u root -p crossword 
0

クイックや汚れ:)

'\'として、または''(ダブルアポストロフィ)のようにエスケープする必要があります。

次の例では、\'を使用しています。

sed "s/'/\\\'/g;s/.*/INSERT INTO words (word, word_size) VALUES ('&', CHAR_LENGTH('&'));/" < words.txt | mysql -u root -p pass 

シモンズ:しかし、ダブルチェックする@ chepnerさんのコメント:)あなたは、SQL文にパラメータを渡すのではなく、文字列を使用して文を構築しようとしているため、適切なライブラリを提供した言語に切り替える

関連する問題