ITPub博客

首页 > Linux操作系统 > Linux操作系统 > awk拼sql时要注意分号,单引号的问题.

awk拼sql时要注意分号,单引号的问题.

原创 Linux操作系统 作者:tengrid 时间:2009-05-18 18:50:57 0 删除 编辑

以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/,如需转载,请注明出处,否则将追究法律责任。

上一篇: mysql支持gbk(zt)
请登录后发表评论 登录
全部评论

注册时间:2009-05-18

  • 博文量
    136
  • 访问量
    378010