各位,现在遇到一个问题,请大家指教,先说说我的oracle是在日文系统下的(没办法,给小日本干活),我想在存储过程中做一些字符串修改的操作,比如有一个字段长度是20个字节,1-5:名称(可能有全角)、6-8:编码(半角如:1F0),其他可以忽略,我需要把编码修改成2F1。现在遇到的问题是:如果名称(字符串的前5个字节)是三个空格+一个全角字符,我使用oracle的Substr肯定是不可以的,使用SubStrb函数也是不行的,因为日文系统下的全角字符是三个字节。所以在我先将字段中取出的字符串使用Convert函数将他转换成一下字符集:v_SeatInf := convert(r_SEEK_ROW.Seat_Inf,'JA16SJIS'); 转换之后全角就是两个字节,我再使用substrb函数来修改编码,v_SeatInf := substrb(v_SeatInf,1,(v_i * 20) + 5 ) || v_c_Pei || v_c_Func || substrb(v_SeatInf,(v_i * 20) + 5 +4);最后再把字符集转化回来:v_SeatInf := convert(v_SeatInf,'AL32UTF8','JA16SJIS'); 然后就发现全角字符变成了乱码,郁闷。大家可能看得比较晕,那就简单点:
select convert(substrb(convert('   一1F0', 'JA16SJIS'), 1, 5) || substrb(convert('   一1F0', 'JA16SJIS'),6),'AL32UTF8','JA16SJIS') from dual;这样的一条的执行结果是:   ?1F0。       不知道为什么那个"一"(日文中的汉字一)变成了乱码,有没有知道或者遇到相同问题的好心人指点一下啊。

解决方案 »

  1.   

    帮你顶
    _______________________________
    DBA请进群QQ群:37204725
      

  2.   

    SQL> select convert(substrb(convert('   一1F0', 'JA16SJIS'), 1, 5)  | | substrb(convert('   一1F0', 
    'JA16SJIS'),6),'AL32UTF8','JA16SJIS') from dual;CONVERT(S
    ---------
       涓€1F0正常应该显示什么?
      

  3.   

    正常情况下,应该就是显示‘   一1F0’这个字符串的内容,这个SQL就是把这个字符串截开再拼起来,没有什么变化
      

  4.   

    SELECT CONVERT (CONVERT ('   一1F0', 'JA16SJIS'), 'AL32UTF8', 'JA16SJIS')
      FROM DUAL--------------
       涓€1F0还是没太明白什么意思,将substrb换成substr试试?