Oracle数据类型-----(数字格式)

任何一个实数都是可以表示为:S=A.B*10n(10的n次方)。则我们只是需要存储A.B(数据部分),n(最高表示位)即可。可是oracle 还存储了符号位(负数需要用到)。

create table test_number ( num_col number);

SQL> INSERT INTO TEST_NUMBER VALUES (0);

1 row inserted

SQL> INSERT INTO TEST_NUMBER VALUES (1);

1 row inserted

SQL> INSERT INTO TEST_NUMBER VALUES (2);

1 row inserted

SQL> INSERT INTO TEST_NUMBER VALUES (25);

1 row inserted

SQL> INSERT INTO TEST_NUMBER VALUES (123);

1 row inserted

SQL> INSERT INTO TEST_NUMBER VALUES (4100);

1 row inserted

SQL> INSERT INTO TEST_NUMBER VALUES (132004078);

1 row inserted

SQL> INSERT INTO TEST_NUMBER VALUES (2.01);

1 row inserted

SQL> INSERT INTO TEST_NUMBER VALUES (0.3);

1 row inserted

SQL> INSERT INTO TEST_NUMBER VALUES (0.00000125);

1 row inserted

SQL> INSERT INTO TEST_NUMBER VALUES (115.200003);

1 row inserted

SQL> INSERT INTO TEST_NUMBER VALUES (-1);

1 row inserted

SQL> INSERT INTO TEST_NUMBER VALUES (-2);

1 row inserted

SQL> INSERT INTO TEST_NUMBER VALUES (-20032);

1 row inserted

SQL> INSERT INTO TEST_NUMBER VALUES (-234.432);

1 row inserted

SQL> COMMIT;

Commit complete



SQL> SELECT NUM_COL, DUMP(NUM_COL, 16) D_NUMBER FROM TEST_NUMBER;

NUM_COL D_NUMBER
---------- --------------------------------------------------------------------------------
0 Typ=2 Len=1: 80
1 Typ=2 Len=2: c1,2
2 Typ=2 Len=2: c1,3
25 Typ=2 Len=2: c1,1a
123 Typ=2 Len=3: c2,2,18
4100 Typ=2 Len=2: c2,2a
132004078 Typ=2 Len=6: c5,2,21,1,29,4f
2.01 Typ=2 Len=3: c1,3,2
0.3 Typ=2 Len=2: c0,1f
1.25E-6 Typ=2 Len=3: be,2,1a
115.200003 Typ=2 Len=6: c2,2,10,15,1,4
-1 Typ=2 Len=3: 3e,64,66
-2 Typ=2 Len=3: 3e,63,66
-20032 Typ=2 Len=5: 3c,63,65,45,66
-234.432 Typ=2 Len=6: 3d,63,43,3a,51,66

15 rows selected



0 :没有数据部分,只存储了一个最高表示位。

1 :最高表示位 为 C1 。这是为什么那??

正数和负数具有相同的取值范围,所以,正数的最高表示位 > 80 ; 负数的最高表示位 < 80 。

但是正数部分又分为:大于1的数和小数,并且同样具有相同的取值范围。



计算公式如下:

SQL> select round( (to_number('ff','xx') - to_number('80','xx'))/2 + to_number('80','xx') ) + 1 from dual ;

ROUND((TO_NUMBER('FF','XX')-TO
------------------------------
193

SQL> select to_char('193','xx') from dual;

TO_CHAR('193','XX')
-------------------
c1

所以,个数的最高表示位为:C1。

则百位的最高表示位为C2,万位的最高表示位为C3,百分位的最高表示位为C0,万分位的最高表示位为C0,以此类推。

这又是为什么哪?

Oracle每个字节表示2位数,两位数之间相差的是100(即10的平方)。所以百位的最高表示位为C2.



但是oracle又为什么用0x2表示1哪???

对于这个2位数,出现的可能是0~99共100种可能,问题出在0这里。Oracle底层是用C语言实现的,我们知道二进制0在C语言中用作字符串终结符,Oracle为了避免这个问题,因此使用了0x1表示0,并依次类推,使用0x64表示99。



-1 Typ=2 Len=3: 3e,64,66 , 最高表示位 为什么 是 3e??

因为,负数和正数互为相反数。其最高表示位相加为 255 , 数据部分相加为:66 。所以-1的最高表示位为 3e。

SQL> select to_char('193','xx') from dual;

TO_CHAR('193','XX')
-------------------
c1

SQL> select to_number('3e','xx') from dual ;

TO_NUMBER('3E','XX')
--------------------
62

负数的数据部分用 65 到 2 进行表示。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值