2017-01-20 4 views
1

Я пытаюсь прочитать текстовый файл, содержащий очень длинный список слов и вставку их и их длину в базу данных для дальнейшего анализа.bash, escaping apostrophe в выражении SQL в bash

Сценарий у меня есть работы, пока он не достигнет слова с апострофом. То, что я в настоящее время:

#!/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

Прежде всего, отправьте свои инструкции SQL на стандартный вывод, удалив команду pipe и mysql. Затем выполните каждую инструкцию 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 в :)

Смежные вопросы