以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博客 ” ,链接:https://blog.itpub.net/94384/viewspace-600261/ ,如需转载,请注明出处,否则将追究法律责任。