2 votes

Comment insérer un texte long (ex:Html) d'une variable dans MySQL en utilisant linux bash ?

Je veux insérer du html dans une colonne mysql longtext mais je tombe toujours sur une erreur :

/usr/bin/mysql: Argument list too long

lorsque la taille de la corde est trop grande (c'est du moins ce que je pense)

voici le code :

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"

J'ai créé le code en utilisant hacks comme certaines choses telles que mySQL-escaping y sortie de stderr et stdout dans des variables différentes ne sont pas disponibles par défaut dans bash.
Je prévois d'utiliser le code dans un script pour l'indexation et la mise en cache sur le web, la vitesse est donc importante. Ce qui m'amène à ma deuxième question : Existe-t-il un moyen plus rapide de faire cela en bash ?

0voto

shellter Points 15304

Vous devriez pouvoir faire quelque chose comme

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

Renseignez-vous sur les "documents ici" et tout devrait bien se passer. (Les documents ici sont les documents <

Si cela ne fonctionne pas et que vous obtenez toujours arg list too long alors vous n'avez pas tout cité correctement. Je n'ai pas mysql à ma disposition, mais d'après les tests que j'ai pu faire, cela devrait fonctionner, et le document ici peut être très long (bien que je pense que même eux ont des limites à de très grandes valeurs).

EOS peut être n'importe quelle chaîne de caractères, mais il s'agit d'une abréviation auto-documentée pour EndOfScript.

Je suppose que mySQL permet aux colonnes d'être citées avec le caractère bck-quote. Bien que vous puissiez le faire parce que vous commencez votre exemple avec des guillemets simples, ce n'est pas une bonne solution.

I

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X