2

我想将 html 插入到 mysql longtext 列中,但我一直遇到错误:

/usr/bin/mysql: Argument list too long

当字符串大小很大时(至少我是这么认为的)

这是代码:

link="7red.no"    
result=$( { stdout=$(wget -T10 -t1 "$link" -v -O -) ; } 2>&1; echo "--SePaRaToR--"; echo "$stdout"); 
dowload_stat=${result%$'\n'--SePaRaToR--*}; 
html=${result#*--SePaRaToR--$'\n'}; 
printf -v dowload_stat "%q" "$dowload_stat"
printf -v html "%q" "$html"
sqlHtml='INSERT INTO `'"${tableHtml}"'` (`extracted_link_ID`, `response_header`, `html`, `download_start`, `download_finish`) VALUES ('"'${link_id}'"', '"${dowload_stat:1}"', '"${html:1}"', '"'${start}'"', '"'${finish}'"');'
mysql -u$dbUser -p$dbPass -h$dbHost -P$dbPort -D$dbName --default_character_set utf8 -A -e "$sqlHtml"

我使用hacks编写了代码,因为在 bash 中默认情况下不提供mySQL 转义在不同变量中输出 stderr 和 stdout之类的东西。
我计划在工作脚本中使用代码进行网络索引/缓存,所以速度很重要。这让我想到了第二个问题:在 bash 中是否有更快的方法来做到这一点?

4

1 回答 1

0

你应该能够做类似的事情

mysql -u$dbUser -p$dbPass -h$dbHost -P$dbPort -D$dbName --default_character_set utf8 -A <<EOS 
    INSERT INTO \"${tableHtml}\" ('extracted_link_ID', 'response_header', 'html', 
       'download_start', 'download_finish') 
    VALUES (\"${link_id}\", \"${dowload_stat:1}\", \"${html:1}\", \"${start}\", \"${finish}\");
 EOS

阅读“这里的文件”,你应该没问题。(这里的文档是 <

如果这不起作用,并且您仍然得到arg list too long,那么您没有正确引用所有内容。我没有可用的 mysql,但是鉴于我能够进行的测试,这应该可以工作,并且此处的文档可能非常长(尽管我认为即使它们在非常大的值上也有限制)。

EOS 可以是任何字符串,但它是 EndOfScript 的自记录简写。

我假设 mySQL 允许用 bck-quote 字符引用列。虽然您可以这样做,因为您以单引号开始您的示例,而不是一个好的 shell-fu。

我希望这有帮助。

于 2012-04-19T03:06:30.677 回答