解决思路:汉字是由两个字节存储的,每个字节的数值都>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