db2中处理半个汉字乱码

解决思路:汉字是由两个字节存储的,每个字节的数值都>127。把字符串按字节顺序截取,当出现第一个字节是>127,但是后面一个字节是<127的这种情况,就丢弃掉。

CREATE FUNCTION IDM.FUN_DEAL_GARBARGE(INVALUE VARCHAR(4000))
   RETURN VARCHAR(4000)
   LANGUAGE SQL
   BEGIN
      DECLARE OUTVALUE varchar(8000);        --输出变量
	  DECLARE i integer;                     --计数
	  DECLARE i_asccii integer;              --当前字符的ascii码(高字节)
	  DECLARE i_next_ascii integer;          --下一字符的ascii码(低字节)
	  DECLARE chinese_char varchar(2);       --汉字
	  set i=1;
	  set OUTVALUE='';
	  
	  while i<=length(INVALUE)
	  do
	     set i_asccii=(select ascii(INVALUE,i,1) from sysibm.dual); --取当前字符的ascii码
		 if i_asccii>127       --大于127时检查后面一个字节
		 then
		    if i+1<length(INVALUE)
			then
			   set i_next_ascii=(select ascii(INVALUE,i+1,1) from sysibm.dual);
			end if;
			if i_next_ascii>127 
			then
			    set chinese_char=chr(i_asccii)||chr(i_next_ascii); --高字节和低字节分别转成字符再拼接起来
			    set i=i+2;
			else
			   set chinese_char=''; --第一个字节>127,但是后面一个字节<127时丢弃此字节。
			   set i=i+1;
			end if;
			set OUTVALUE=OUTVALUE||chinese_char;
		 else
		    set OUTVALUE||substr(INVALUE,i,1);
			set i=i+1;
		 end if;
	  end while;
	  return OUTVALUE;
   END

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值