awk拼sql時要注意分號,單引號的問題.
以TAB分隔三列
第1列: 分表編號 (str)
第2列: id (bigint)
第3列:title (varchar)
要求將分表中對應id的title改為新的title值
example: update tablename_nnn set title='很亮吧#%%%' where id=338542209638673 ;
-----------------------------1.txt-----------------------------------------
001 338331755308082 智慧達SR-381 收音機/錄音機 全國聯保 質量100%
001 338469194938850 貝貝車集 越野摩托車011#$%
001 338486374868259 貝貝車集 電動腳踏車!·#¥%
001 338542209638673 很亮吧#%%'%.....
--------------------------------------------------------------------------
這裡要注意幾個問題:
1), 因為第3列為varchar,在update中必須用單引號括起. 所以,title中的'必須轉義 \'
2), 第3列可以包括任何字元,為了防止單引號內出現半個漢字以至亂碼的情況,需要在末尾補充一個空格字元.
3), 一定要注意檢查titil中的分號';', 因為可能會引起update語句語義改變,導致where子句失效
例如: update tablename_nnn set title='很亮吧';#%%%' where id=338542209638673 ;
這句實際上相當於:update tablename_nnn set title='很亮吧';
導致會更新這個表中的所有記錄上的title欄位!
1, 將檔案中title中的單引號轉換成轉義形式'===>\'
$sed "s/'/\\\'/g" 1.txt >2.txt sed單引號與斜槓都要轉義!
001 338331755308082 智慧達SR-381 收音機/錄音機 全國聯保 質量100%
001 338469194938850 貝貝車集 越野摩托車011#$%
001 338486374868259 貝貝車集 電動腳踏車!·#¥%
001 338542209638673 很亮吧#%%\'%.....
2, 用awk拼sql
awk '{printf("update tablename_%s set title=\47%s \47 where id=%s;\n",$1,$3,$2) >"2.sql"}' 2.txt
\047是加單引號,在awk中不能直接用', 注意%s後有一個空格避免半個漢字
update tablename_001 set title='智慧達SR-381 ' where id=338331755308082;
update tablename_001 set title='貝貝車集 ' where id=338469194938850;
update tablename_001 set title='貝貝車集 ' where id=338486374868259;
update tablename_001 set title='很亮吧#%%\'%..... ' where id=338542209638673;
3, 將title中包括了分號的行拿出來,檢查是否會引起sql語義改變
sed 's/;$//g' 2.sql|grep ";" >include_semicolon.sql
update tablename_001 set title='貝貝車集 ' where id=338469194938850
update tablename_001 set title='貝貝車集 ' where id=338486374868259
顯然不會出現前述情況.
經過上述步驟後,可以直接執行2.sql了.
如果應用程式中對title進行嚴格的輸入檢查,不允許出現單引號,分號,轉義符,等等特殊字元的話,就不存在上述麻煩的轉換步驟了.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/94384/viewspace-600261/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL語句中的單引號與雙引號SQL
- 向SQLServer插入單引號問題SQLServer
- 在ORACLE SQL語句中,單引號和雙引號的使用OracleSQL
- 儲存過程單引號問題儲存過程
- Golang的單引號、雙引號與反引號Golang
- linux 單引號,雙引號,反引號Linux
- ORACLE 單引號 雙引號Oracle
- Linux Shell 中的反引號,單引號,雙引號Linux
- Ask Hoegh(7)——寫sql時如何輸出單引號?SQL
- Oracle中的 單引號 和 雙引號Oracle
- oracle 裡的單引號與雙引號Oracle
- HTML 單引號與雙引號HTML
- linux bash中的引號:單雙引號、反撇號Linux
- grep 後加單引號、雙引號和不加引號的區別
- shell 指令碼中雙引號、單引號、反引號的區別指令碼
- Python中 單引號,雙引號和三引號的區別Python
- Jquery單引號和雙引號的使用注意jQuery
- 【轉義】使用SQL生成SQL語句時單引號的轉義處理SQL
- python中單引號,雙引號,多引號區別Python
- 扯不完的 JS 分號問題JS
- shell中單引號、雙引號、反引號、反斜槓的區別
- Postgresql中DDL的雙引號問題SQL
- Oracle中單引號和雙引號的區別Oracle
- PHP中單引號和雙引號的區別PHP
- oracle 中使用單引號(')和雙引號(")Oracle
- 單引號在動態SQL中的處理SQL
- Oracle中單引號與雙引號的區別分析Oracle
- 【C進階】14、單引號和雙引號
- javascript的雙引號和單引號的用法和區別JavaScript
- PHP中對單引號和雙引號的區別(好文)PHP
- Mysql單引號使用MySql
- 關於 json 單引號和雙引號區別--請使用雙引號JSON
- Linux Shell 單引號 雙引號 使用區別Linux
- 【轉義】使用SQL生成SQL語句時單引號的轉義處理之q'{}'方法SQL
- shell中定義變數用雙引號和單引號以及不用引號的區別變數
- db2 sql輸出帶有單引號DB2SQL
- JS中缺少分號可能引發的問題JS
- mybatis大於號,小於號,去地址符,單引號,雙引號轉義說明MyBatis