2012-01-12 36 views
0

可能性の重複:
Insert file contents into MySQL table's column負荷量

私は、テーブルの特定のセルにファイルの内容をロードする、またはそれにより正確には、私は特定のセルを更新したいのですが、更新後のセルの内容はファイルの内容でなければなりません。コマンドラインによる好ましい

。私の最初の試みは、私が達成したいと思っていたものです。

mysql -p -u user -e "update my_table set body='`cat filename`' where id=x;" dbname 

もちろん、mysqlはファイル内の特殊文字に問題があります。あるいは、私はperlの1つのライナーに同意するでしょう。

+0

は、私はいくつかの詳細については不明です。完全なファイルの(短い)例を、それがファイルの場合に使用できるSQL文と共に与えることができますか? – ruakh

+0

(特に、私が不明な点は、ファイル全体が1つのテーブルセルに入っているのか、それともファイルの各行が別の行に入っているのかということです) – ruakh

+0

@ruakhファイル全体が既存の行の単一の表セルに転送することができます。あなたは正しい '列'は非常に誤解を招く、私はそれを変更します – user1146332

答えて

1

あなたはチャールズSprayberryは、上記にリンクの質問への答えで与えられたLOAD_FILE機能を使用することができます。すなわち、このようになります。

mysql -p -u user -e "update my_table set body=load_file('/path/to/filename') where id=x;" dbname 

それは(原因パーミッションの問題やその他もろもろに、例えば)あなたのために動作しない場合は、あなたの問題を解決するためにバッシュとsedの機能を使用することによって、異なったあなたの問題を解決します次のように、コマンドを既存:な改行やその他もろもろのように

ほとんどの特殊文字を、単一引用符で囲まれた文字列の内側だけで罰金であるように見えます。問題となる文字は、'(文字列を終了すると解釈される)と\(エスケープシーケンスを導入すると解釈されます)です。これらは両方とも、接頭語「\」(たとえば、'\''そして'\\''\、それぞれ)を表す文字列リテラルです。このsedスクリプトは、任意の'または\\を挿入します。

あなたは、このようバッシュから呼び出すことができます
s/\('\|\\\)/\\\1/g 

sed 's/\('"'"'\|\\\)/\\\1/g' filename 

(たとえば、filenameこの含まれている場合:

a \ b \ c 
d ' e ' f 

そしてsed 's/\('"'"'\|\\\)/\\\1/g' filenameはこれを印刷します:

a \\ b \\ c 
d \' e \' f 

)。しかし、あなたは`...`に上記の文字をラップすることはできません。なぜならこれらの文字はBashにとっても特別なものであり、混乱するからです。 (私はあなたがBashを使用していると仮定していますか?)代わりに$(...)を使用する必要があります。これは`...`に相当するBash表記法です。 (私はいつも`...`$(...)を使用することをお勧めします)だからあなたの全体的なコマンドは次のようになります

mysql -p -u user -e "update my_table set body='$(sed 's/\('"'"'\|\\\)/\\\1/g' filename)' where id=x;" dbname 
+0

ありがとう!あなたの最初の提案は、私に 'GRANT FILE ON *。* TO ME @ localhost'との対応する権利を与えた後に動作します。 – user1146332

+0

@ user1146332:ようこそ! – ruakh