2017-01-20 27 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的评论:)