2017-01-20 28 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

您切換到提供正確的庫將參數傳遞到一個SQL語句,而不是試圖建立基於字符串的陳述語言操作。 – chepner

+0

是的,我可以使用PHP,但這樣一個小的東西只能使用一次,但在一個非常大的單詞列表(800k字),不會更快? –

+0

首先,請刪除您的管道和mysql命令,將您的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 

PS:不過,仔細檢查@ chepner的評論:)