awk拼sql時要注意分號,單引號的問題.

tengrid發表於2009-05-18

以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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章