日期:2014-05-16  浏览次数:20487 次

oracle 全角、半角转换,和oracle 的 DUMP函数
to_single_byte(c)转换成半角
to_multi_byte(c)转换成全角


dump查看
SELECT '12345',
        DUMP('12345'),
        TO_SINGLE_BYTE('12345'),
        DUMP(TO_SINGLE_BYTE('12345'))
FROM dual;



DUMP函数返回一个Varchar2的值,该值格式如下
Type=××× Len=×××: ×××(,×××)*

Type可以参阅Data Types
Len 字节数
参数说明:
return_fmt
8  返回8进制结果
10 返回10进制结果
16返回16进制结果
17以每个字节作为单个字符返回,当且仅当它可以被解释为编译器的字符集中的可打印字符-------通常是ASCII or EBCDIC。

start_position and length
确定要返回的内部表示形式的哪个部分。
expr 为 null,则此函数返回 NULL。
该函数不支持CLOB直接作为参数。但是,可以作为通过隐式数据转换参数中传递 CLOB值。

例子如下:
SQL> select dump(1,16) from dual;
DUMP(1,16)
-----------------
Typ=2 Len=2: c1,2

SQL> select dump(1,10) from dual;
DUMP(1,10)
------------------
Typ=2 Len=2: 193,2

SQL> select dump('火狐',16) from dual;
DUMP('火狐',16)
-------------------------
Typ=96 Len=4: bb,f0,ba,fc

SQL> select dump('US',16) from dual;
DUMP('US',16)
-------------------
Typ=96 Len=2: 55,53

SQL> select dump('US',17) from dual;
DUMP('US',17)
-----------------
Typ=96 Len=2: U,S

SQL> select dump('火狐',17) from dual;
DUMP('火狐',17)
-------------------------
Typ=96 Len=4: bb,f0,ba,fc

SQL> select dump(1,17) from dual;
DUMP(1,17)
------------------
Typ=2 Len=2: c1,^B

SQL> select dump('火狐',17,1,1) from dual;
DUMP('火狐',17,1
----------------
Typ=96 Len=4: bb

SQL> select dump('火狐',17,1,2) from dual;
DUMP('火狐',17,1,2)
-------------------
Typ=96 Len=4: bb,f0


其次,了解一下Number类型数据在DUMP是如何处理的。
Number型数据经DUMP函数处理以后,输出格式如下:
Type=2 Len=×××:符号/指数位,  [数字1,数字2,数字3,. . . ,数字20]
Type=2 :表示Number类型
注意:如果是负数,且总长度小于21个字节,最后加一个102(是为了排序的需要)


DUMP(number,10)是以指数的方式处理的
正数: 符号/指数位 > 128
         计算公式:
                   指数=符号/指数位(第一字节)-193, 设 N为指数
                   数值1 = (数字1-1)*100^(N-0)
                   数值2 = (数字2-1)*100^(N-1)
                   .
                   .
.
数值20 = (数字20-1)*100^(N-19)
-------------------------
     Number数值  sum(数值1,数值2,数值3,. . . , 数值20)

负数:符号/指数位 < 128
指数=62-符号/指数位(第一字节),设 N为指数
                   数值1 = (101-数字1)*100^(N-0)
                   数值2 = (101-数字2)*100^(N-1)
                   .
                   .
.
数值20 = (101-数字20)*100^(N-19)
-------------------------
     Number数值  sum(数值1,数值2,数值3,. . . , 数值20)

0是区分正数和负数的分割点,0既不属于正数也不属于负数

0的以10进制方式DUMP出来的信息如下:
SQL> select dump(0) from dual;
DUMP(0)
----------------
Typ=2 Len=1: 128
根据上面的信息,我们可以计算得到16进制的DUMP信息应该是0X80,转换成二进制为1000 0000,正好是是一个字节编码最大值的一半。