mysql
2012-01-12 72 views 0 likes 
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單行。

+0

我對一些細節還不清楚。你可以給出一個完整文件的(簡短)例子,以及如果這個文件是可以使用的SQL語句嗎? – ruakh 2012-01-12 20:18:11

+0

(特別是,我不清楚的是:整個文件應該放入單個表格單元格中,還是應該將文件的每一行放入單獨的行中?) – ruakh 2012-01-12 20:27:09

+0

@ruakh整個文件應該被轉移到現有行的單個表格單元中。你是對的'專欄'是非常誤導,我會改變, – user1146332 2012-01-12 22:07:26

回答

1

您也許可以使用Charles Sprayberry鏈接到上面的問題的答案中給出的LOAD_FILE函數。這將是這樣的:

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

如果不適合你的工作(例如,由於權限問題或諸如此類的東西),然後你不同的解決您的問題,通過和Bash的特點sed解決您的現有命令,如下所示:

大多數特殊字符(如換行符和whatnot)在單引號字符串中似乎都很好。應該成爲問題的唯一字符是'(將被解釋爲終止字符串)和\(這將被解釋爲引入轉義序列),並且這兩個字符都可以通過在\(例如,'\'''\\'分別是表示'\的字符串)。這sed腳本插入\之前的任何'\

s/\('\|\\\)/\\\1/g 

你可以從Bash的調用是這樣的:

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 *。* *給我@ localhost'相對應的權利後起作用。 – user1146332 2012-01-13 14:55:25

+0

@ user1146332:不客氣! – ruakh 2012-01-13 15:06:17

相關問題