有问题么?我试下来没有问题。
服务器和客户端都是英文。
ASC字符串==>16进制串
create or replace function AscToHex(sIn IN varchar2)
RETURN varchar2
IS
sTmp varchar2(4000);
i integer;
BEGIN
i:=1;
stmp:='';
for i in 1..length(sIn) loop
   sTmp:=sTmp||trim(to_char(ascii(substr(sIn,i,1)),'XXXX'));
end loop;
return sTmp;
END;
/16进制串==>ASC字符串
create or replace function HexToAsc(sIn IN varchar2)
RETURN varchar2
IS
sTmp varchar2(4000);
i integer;
BEGIN
i:=1;
stmp:='';
loop
   exit when i>length(sIn);
   sTmp:=sTmp||chr(to_number(substr(sIn,i,2),'XXXX'));
   i:=i+2;
end loop;
return sTmp;
END;
/SQL>select hextoasc(asctohex('你好ABC么')) from dual;
HEXTOASC(ASCTOHEX('拿好ABC么'))
--------------------------------------------------------------------------------
你好ABC么

解决方案 »

  1.   

    to  enhydraboy(乱舞的浮尘) 
    你是在中文字符集的数据库下吗?
      

  2.   

    HexToAsc这个函数有问题,我的数据库是中文字符集8.1.6的
      

  3.   

    sorry
    中文下,好像是由问题,问题在于字符的长度计算不同,在英文字符集下,
    SQL>select length('你') from dual;
    结果是2
    SQL>select length('你') from dual;
    结果是1所以,你应该这样写
    SQL> select chr(210*16*16+166) from dual;CHR(
    ----

      

  4.   

    在中文字符集下,HexToAsc应该修改成
    create or replace function HexToAsc(sIn IN varchar2)
    RETURN varchar2
    IS
    sTmp varchar2(4000);
    i integer;
    x integer;
    BEGIN
    i:=1;
    stmp:='';
    loop
       exit when i>length(sIn);
       x:=to_number(substr(sIn,i,2),'XXXX');
       if x>128 then
         sTmp:=sTmp||chr(to_number(substr(sIn,i,4),'XXXX'));
         i:=i+4;
       else
         sTmp:=sTmp||chr(to_number(substr(sIn,i,2),'XXXX'));
         i:=i+2;
       end if;
       
    end loop;
    return sTmp;
    END;
    /
      

  5.   

    select chr(210*16*16+166) from dual;能说明chr(210)||chr(166) 转换为 chr(210*16*16+166) 的原理吗?这个对我很重要
      

  6.   

    我明白了这个转换中英文ASCII吗好象也不一样
    英文下
    select ascii(substr('要',1,1)) from dual
    --返回210中文下
    select ascii(substrb('要',1,1)) from dual
    --返回32
      

  7.   

    谢谢enhydraboy(乱舞的浮尘),还有一事请教:
    --字符串到十六进制转换
    CREATE OR REPLACE function strtohex(str varchar2)
     return varchar2
    is
      i number;
      j number;
      s char;
      n number;
      rst varchar2(2000);
    begin
      i := 1;
      j := 0;
      n := 0;
      rst := '';
      Loop
        s := substr(str, i, 1);
      if ((s between chr(32) and chr(127)) and s<>'=')
        or (s=chr(13))
        or (s=chr(10))
     then
       rst := rst || s;
       j := j+1;
     else begin
       if (mod(n, 2)=0) and (s<>'=') then
         rst := rst ||'='|| to_hex(ascii(s));
     n:= 0;
       else
         rst := rst || to_hex(ascii(s));
       if s='=' then n:=n-1; end if;  
       end if;  
       n := n + 1;  
       j := j + 3;
         end;
        end if;
     if (s=chr(13)) or (s=chr(10)) then
       j := 0;
     end if;
     if j >= 70 then
       rst := rst || chr(13)||chr(10);
       j := 0;
     end if;
        exit when i=lengthb(str);
        i := i + 1;
      end loop;
    return rst;
    end;
    /函数功能:在中文字符集下,把字符串转换为十六进制的串SQL>  select strtohex('asffd你ksjdhf好akjdfhlf!') from dual;STRTOHEX('ASFFD拿KSJDHF好AKJDFHLF!')
    -------------------------------------------------
    asffd=C4E3ksjdhf=BAC3akjdfhlf!十六进制转换为字符
    SQL>select hextostr('asffd=C4E3ksjdhf=BAC3akjdfhlf!') from dual
    HEXTOSTR('ASFFD=C4E3KSJDHF=BAC3AKJDFHLF!')
    -------------------------------------------------
    asffd你ksjdhf好akjdfhlf!但如果在strtohex函数中含有等于号(=),则返回结果不正确:
    SQL> select strtohex('=你好!') from dual;STRTOHEX('=拿好!')
    -----------------------------------------------------
    3D=C4E3=BAC3!转换为字符:
    SQL>select hextostr('3D=C4E3=BAC3!') from dualHEXTOSTR('3D=C4E3=BAC3!')
    ---------------------------------------------
    3D你好!等号变成3D,因为我是用等号来分割十六进制的以上这个函数要如何改进??
      

  8.   

    中文字符下,我的asctohex本来就可以的。
    如果你想实现,用=号来分割16进制,你需要自己再外面再套一层函数。这个函数功能就是解决以=号为分割符,split你的串,并且转换出来,再拼接起来。good luck
      

  9.   

    asctohex是可以,但如果是字母和汉字混合,比较难解析
      

  10.   

    to Michaelyfj(星星还是那颗星星)
    “字母和汉字混合,比较难解析”,为什么呢?我认为一点都不难。对于varchar来说,汉字是由两个字节组成,而英文是由一个字节组成。汉字的两个字节的数值都是>127。所以,我认为一点都不难,没有必要用=来分割。
    呵呵,如果你要分割的话,你本身已经可以做到正确区分汉字的英文字符了,难道不是么?
    你同时可以参考一下,我解答的另外一个去掉半个汉字的问题。
    http://expert.csdn.net/Expert/topic/1901/1901102.xml?temp=.999386
      

  11.   

    谢谢enhydraboy(乱舞的浮尘) 
    前面这些问题已经搞定了,但又提出个新问题:oracle客户端是英文字符集,数据库服务器是中文字符集,
    应用程序运行在英文字符集的客户端,如何正常查询并显示数据库服务器的信息?根据转换方式可能就不行了吧?
      

  12.   

    你把oracle客户端的字符集和服务器设置成一样的。
    windows下,注册表hkey_local_machine\software\oracle\home0\
    把nls_lang设成SIMPLIFIED CHINESE_CHINA.ZHS16GBK就可以了。