互联网服务

DB2删除不可见字符

由于用户在系统中录入或者导入数据的时候可能带入一些不可见字符,对应用程序产生了消极影响,需要对这些数据进行处理。
1.不可见字符出现的位置不固定,但大多数情况下出现在字符串的开头和结尾
2.不可见字符不固定,比如:
db2 "select x'07E59BBD' from sysibm.sysdummy1" 该字符串中就产生了x'07'的不可见字符
3.希望处理程序的扩展性强。现在还无法确定,目前数据库中录入的信息有哪些控制字符或不可见字符。
如果能找到方法这些包含不可见字符的数据找出来并修正就好了。
参与8

7同行回答

jlandzpajlandzpa系统运维工程师广州华南资讯科技有限公司
弄好的话,请总结下,很实际的一个问题。显示全部
弄好的话,请总结下,很实际的一个问题。收起
系统集成 · 2012-12-24
浏览1693
ppjava2009ppjava2009系统工程师用友汽车信息科技(上海)有限公司
查一下ASCII码表就知道了 * 特殊字符处理 * 1.转换关系  ASCII(char)查询字符的ASCII,CHR(ascii)查询ASCII对应的字符 * 2.常见特殊字符 *    可见字符:大小字母A-Z 65~90  小写字母a-z 97~122  数字48-57 空格32、!33、"34、#35...显示全部
查一下ASCII码表就知道了
 * 特殊字符处理
 * 1.转换关系  ASCII(char)查询字符的ASCII,CHR(ascii)查询ASCII对应的字符
 * 2.常见特殊字符 
 *    可见字符:大小字母A-Z 65~90  小写字母a-z 97~122  数字48-57 空格32、!33、"34、#35、$36、%37、&38、'39、(40、)41、*42、+43、,44、-45、.46、/47、:58、;59、<60、=61、>62、?63、@64、[91、92、]93、^94、_95、`96、{123、|124、}125、~126
 *    不可见字符:回车13、ESC27、换行10、制表符9、退格8、垂直制表符11
 *    中文符号:,EFBC8C、—E28094、、E38081、。E38082、?EFBC9F、;EFBC9B、:EFBC9A、’E28099、”E2809D、【E38090、】E38091、!EFBC81、¥EFBFA5、…E280A6、(EFBC88、)EFBC89
 *    中文全角字符: E38080、@EFBCA0、#EFBC83、%EFBC85、&EFBC86、× C39720、{EFBD9B、}EFBD9D、~EFBD9E、\EFBCBC、
 *    汉字范围:其它三个字节的字符为汉字
收起
互联网服务 · 2012-12-21
浏览1806
wangyaxwangyax软件开发工程师金融机构
这个的确不错,我也打算使用function来做了。大家知道不可见字符或者特殊字符的范围吗?我想仅仅保留数据、英文和普通汉字,其他的全部过滤掉。显示全部
这个的确不错,我也打算使用function来做了。
大家知道不可见字符或者特殊字符的范围吗?

我想仅仅保留数据、英文和普通汉字,其他的全部过滤掉。收起
互联网服务 · 2012-12-21
浏览1684
ppjava2009ppjava2009系统工程师用友汽车信息科技(上海)有限公司
我写过一个DB2函数,仅供参数,改改可能对你有用 。CREATE FUNCTION strdec(v_src VARCHAR(10000))RETURNS VARCHAR(32672)SPECIFIC strdecBEGIN ATOMIC  /**   * 功能说明: 列举输入的字符串中各字符的相关详细信息   * 作者: 540   ...显示全部
我写过一个DB2函数,仅供参数,改改可能对你有用 。
CREATE FUNCTION strdec(v_src VARCHAR(10000))
RETURNS VARCHAR(32672)
SPECIFIC strdec
BEGIN ATOMIC
  /**
   * 功能说明: 列举输入的字符串中各字符的相关详细信息
   * 作者: 540
   * 日期:2012/12/07
   * 实例:
   *     1) 查看指定字符串信息  VALUES strdec('adfds.b?:#^……%¥~,。,。国88788');
   *     2) 查看指定字符串信息  SELECT strdec('adfds.b?:#^……%¥~,。,。国88788') FROM sysibm.sysdummy1;
   *     3) 查看表中字段的数据  SELECT strdec(err_stack) FROM TS_TASK_LOG WHERE err_stack IS NOT NULL FETCH FIRST 100 ROWS ONLY;
   */
  DECLARE v_result VARCHAR(32672) DEFAULT '';
  DECLARE v_left VARCHAR(32672) DEFAULT '';
  DECLARE v_right VARCHAR(32672) DEFAULT '';
  DECLARE v_char VARCHAR(3) DEFAULT '';
  DECLARE v_hexchar VARCHAR(6) DEFAULT '';
  
  DECLARE v_zm INTEGER DEFAULT 0 ;
  DECLARE v_sz INTEGER DEFAULT 0 ;
  DECLARE v_bd INTEGER DEFAULT 0 ;
  DECLARE v_bd_desc VARCHAR(3000) DEFAULT '';
  DECLARE v_unsee INTEGER DEFAULT 0;
  DECLARE v_unsee_desc VARCHAR(3000) DEFAULT '';
  DECLARE v_zwzf INTEGER DEFAULT 0;
  DECLARE v_zwzf_desc VARCHAR(3000) DEFAULT '';
  DECLARE v_zwzfqj INTEGER DEFAULT 0;
  DECLARE v_zwzfqj_desc VARCHAR(3000) DEFAULT '';
  DECLARE v_other INTEGER DEFAULT 0;
  DECLARE v_charnum INTEGER DEFAULT 0;
  DECLARE v_bytenum INTEGER DEFAULT 0;
  
  SET v_charnum = character_length(v_src,CODEUNITS16);
  SET v_bytenum = length(v_src);
  
  SET v_right = v_src ;
  WHILE length(v_right)>0
  DO
    SET v_left = v_right ;
    SET v_right = substring(v_left,2,CODEUNITS16);
    SET v_char = substring(v_left,1,1,CODEUNITS16);

    IF length(v_char)=1 THEN  /*单个字符占用1个字节*/
      IF (ascii(v_char)>=65 AND ascii(v_char)<=90) OR      /*大小写字母*/
         (ascii(v_char)>=97 AND ascii(v_char)<=122) THEN
        SET v_zm = v_zm + 1 ;
      ELSEIF ascii(v_char)>=48 AND ascii(v_char)<=57 THEN  /*数字0-9*/
        SET v_sz = v_sz + 1 ;
      ELSEIF (ascii(v_char)>=32 AND ascii(v_char)<=47) OR  /*其它英文标点符号*/
             (ascii(v_char)>=58 AND ascii(v_char)<=64) OR
             (ascii(v_char)>=91 AND ascii(v_char)<=96) OR
             (ascii(v_char)>=123 AND ascii(v_char)<=126) THEN
        SET v_bd = v_bd +1 ;      
        IF locate(v_char,v_bd_desc)=0 THEN
          SET v_bd_desc = v_bd_desc || ' ' || v_char ;
        END IF ;
      ELSE                                                 /*其它不可见字符*/
        SET v_unsee = v_unsee + 1 ;      
        IF locate(trim(char(ascii(v_char))),v_unsee_desc)=0 THEN
          SET v_unsee_desc = v_unsee_desc || ' chr(' || trim(char(ascii(v_char)))||')' ;
        END IF ;
      END IF;
    ELSEIF length(v_char)=3 THEN  /*单个字符占用3个字节,这里指中文*/
      SET v_hexchar = char(hex(substr(v_char,1,1)))||char(hex(substr(v_char,2,1)))||char(hex(substr(v_char,3,1))) ;
      IF v_hexchar='EFBC8C' OR /*中文符号*/
         v_hexchar='E28094' OR
         v_hexchar='E38081' OR
         v_hexchar='E38082' OR
         v_hexchar='EFBC9F' OR
         v_hexchar='EFBC9B' OR
         v_hexchar='EFBC9A' OR
         v_hexchar='E28099' OR
         v_hexchar='E2809D' OR
         v_hexchar='E38090' OR
         v_hexchar='E38091' OR
         v_hexchar='EFBC81' OR
         v_hexchar='EFBFA5' OR
         v_hexchar='E280A6' OR
         v_hexchar='EFBC88' OR
         v_hexchar='EFBC89'  THEN
        SET v_zwzf = v_zwzf + 1 ;
        IF locate(v_char,v_zwzf_desc)=0 THEN
          SET v_zwzf_desc = v_zwzf_desc || ' ' ||v_char ;
        END IF ;
      ELSEIF v_hexchar='E38080' OR  /*全角字符*/
             v_hexchar='EFBCA0' OR
             v_hexchar='EFBC83' OR
             v_hexchar='EFBC85' OR
             v_hexchar='EFBC86' OR
             v_hexchar='C39720' OR
             v_hexchar='EFBD9B' OR
             v_hexchar='EFBD9D' OR
             v_hexchar='EFBD9E' OR
             v_hexchar='EFBCBC' THEN
        SET v_zwzfqj = v_zwzfqj + 1 ;
        IF locate(v_char,v_zwzfqj_desc)=0 THEN
          SET v_zwzfqj_desc = v_zwzfqj_desc || ' ' ||v_char ;
        END IF ;
      ELSE
        SET v_other = v_other + 1 ;
      END IF;
    ELSE      
    END IF ;
  END WHILE;
  
  SET v_result = '检测到字符个数:'||trim(char(v_charnum))||',占用字节大小:'||trim(char(v_bytenum))||chr(13)||chr(10)||
                 '原字符串是:'||v_src||chr(13)||chr(10)||
                 '可见字符:字母:'||trim(char(v_zm))||',数字:'||trim(char(v_sz))||',标点符号:'||trim(char(v_bd))||(CASE WHEN v_bd>0 THEN ',分别是:'||v_bd_desc ELSE '' END)||chr(13)||chr(10)||
                 '不可见字符:'||trim(char(v_unsee))||(CASE WHEN v_unsee>0 THEN ',分别是:'||v_unsee_desc ELSE '' END)||chr(13)||chr(10)||
                 '中文字符:'||trim(char(v_zwzf))||(CASE WHEN v_zwzf>0 THEN ',分别是:'||v_zwzf_desc ELSE '' END)||chr(13)||chr(10)||
                 '中文全角字符:'||trim(char(v_zwzfqj))||(CASE WHEN v_zwzfqj>0 THEN ',分别是:'||v_zwzfqj_desc ELSE '' END)||chr(13)||chr(10)||
                 '其它字符(包含汉字):'||trim(char(v_other));  
  RETURN v_result;
END;收起
互联网服务 · 2012-12-21
浏览1738
leo_wynleo_wyn商业智能工程师Security
换个解决的思路:1、加强前台的录入校验, (可能是输入大段文字中粘贴过来), 过滤那些对数据质量有严重影响的字符2、设计上的考虑,这样带异常字符的列一般不会作为过滤、比较或连接操作,即使有也可以采用其他的衍生列来替代3、如果一定要在db2中进行过滤和去除,建议使用外部函...显示全部
换个解决的思路:

1、加强前台的录入校验, (可能是输入大段文字中粘贴过来), 过滤那些对数据质量有严重影响的字符
2、设计上的考虑,这样带异常字符的列一般不会作为过滤、比较或连接操作,即使有也可以采用其他的衍生列来替代
3、如果一定要在db2中进行过滤和去除,建议使用外部函数, db2中的函数对这方面支持不好,如全角转半角而且函数造成上下文过多,影响效率收起
系统集成 · 2012-12-21
浏览1665
jlandzpajlandzpa系统运维工程师广州华南资讯科技有限公司
1.先处理行头行尾的2.里面的不可见字符也许就那么几种3.统计一下(select distinct 行头/行尾 from ...)4.进一步处理如果知道合法字符的类型,比如某个列应该全是数字等,就可以更加具体地去处理了。...显示全部
1.先处理行头行尾的
2.里面的不可见字符也许就那么几种
3.统计一下(select distinct 行头/行尾 from ...)
4.进一步处理

如果知道合法字符的类型,比如某个列应该全是数字等,就可以更加具体地去处理了。收起
系统集成 · 2012-12-21
浏览1713
wangyaxwangyax软件开发工程师金融机构
目前我的基本思路有两种:1.通过replace函数将一些控制字符转码成空格或者其他字符2.通过编写function循环将某些固定的控制字符去除但我希望能够得到一个比较通用的方法,通过设置字符集的范围,将不符合字符集的数据全部去除。大家有没有好的办法。通用就行,比如replace(col,c...显示全部
目前我的基本思路有两种:
1.通过replace函数将一些控制字符转码成空格或者其他字符
2.通过编写function循环将某些固定的控制字符去除

但我希望能够得到一个比较通用的方法,通过设置字符集的范围,将不符合字符集的数据全部去除。
大家有没有好的办法。
通用就行,比如replace(col,chr(1),'')就不太通用。

replace(translate(col,chr(1),chr(1)||chr(2)||chr(3)),chr(1),'') 这个也不太好。
兄弟姐妹们,还有更好的办法吗?不介意通过C或者JAVA编写UDF函数。收起
互联网服务 · 2012-12-20
浏览1686

提问者

wangyax
软件开发工程师金融机构

问题状态

  • 发布时间:2012-12-20
  • 关注会员:1 人
  • 问题浏览:6048
  • 最近回答:2012-12-24
  • X社区推广