ORACLE数值类型详解--NUMBER、FLOAT、BINARY_FLOAT、BINARY_DOUBLE、BINARY_INTEGER(二)
其指数范围为-63~0(小数) 1~63(非小数);对于负数,指数范围为63~1(非小数),0~-64(小数)
|-符号信息位,1代表正数,0代表负数
查询是,对于存储在数据域的数据,oracle会将每个字节转换为十进制,然后拼接各个字节。如果指数域的值为正数n,那么会将小数点定位在第n个字节的后面,如果为0,则小数点在第一个字节的前面,如果为负数,则小数点在第一个字节向前推进n个字节。
下面,我们通过实例来看一下上面的说法正不正确:
[sql]
desc tab1
名称 空值 类型
-- -- -------------
C1 NUMBER
C2 VARCHAR2(300)
如果负数的精度很 大,102比较位可能会被舍弃,因此此时102已经起不到任何作用了。
[sql]
SQL> insert into tab1 values(-111111111111111111111111111111111111111111111111111111111111);
已创建 1 行。
SQL> select dump(c1) from tab1;
DUMP(C1)
--------------------------------------------------
Typ=2 Len=2: 193,2
Typ=2 Len=3: 62,100,102
Typ=2 Len=1: 128
Typ=2 Len=6: 197,2,24,46,68,90
Typ=2 Len=7: 58,100,78,56,34,12,102
Typ=2 Len=12: 58,100,78,56,34,12,3,25,47,69,91,102
Typ=2 Len=11: 197,2,24,46,68,90,99,77,55,33,11
Typ=2 Len=21: 33,90,90,90,90,90,90,90,90,90,90,90,
90,90,90,90,90,90,90,90,90
number变种
除number类型外,oracle还为我们提供了一些number的变种数据类型,这些类型其内部实现仍然是number,我们可以将其理解为number的特定别名。
NUMERIC(p,s):完全映射至NUMBER(p,s)。如果p未指定,则默认为38.
DECIMAL(p,s)或DEC(p,s):完全映射至NUMBER(p,s)。如果p为指定,则默认为38
INTEGER或INT:完全映射至NUMBER(38)类型。
SMALLINT:完全映射至NUMBER(38)类型。
FLOAT(b):映射至NUMBER类型。
DOUBLE PRECISION:映射至NUMBER类型。
REAL:映射至NUMBER类型。
在这里需要特别注意的是float类型,参加官方文档:
126. Scale cannot be specified, but is interpreted from the data. Each FLOAT value requires from 1 to 22 bytes.
To convert from binary to decimal precision, multiply n by 0.30103. To convert from decimal to binary precision, multiply the decimal precision by 3.32193. The maximum of 126 digits of binary precision is roughly equivalent to 38 digits of decimal precision.
由此可知,float中的有效数指的是二进制格式的有效数,转换为10进制为b*0.30103. 如果结果不是整数,则采用上侧整数作为底层number存储的precision。如:
[sql]
SQL> desc tab1
名称 是否为空 类型
----------------------------------------- -------- ----------------------------
C1 FLOAT(2)
C2 FLOAT(4)
C3 FLOAT(6)
C4 FLOAT(7)
C5 FLOAT(9)
C6 FLOAT(11)
C7 FLOAT(13)
SQL> insert into tab1 values(1234567890.0987654321,1234567890.0987654321,1234567890.0987654321,1234567890.0987654321,1234567890.0987654321,1234567890.0987654321,1234567890.0987654321);
已创建 1 行。
SQL> select * from tab1;
C1 C2 C3 C4 C5 C6 C7
---------- ---------- ---------- ---------- ---------- ---------- ----------
1000000000 1200000000 1200000000 1230000000 1230000000 1235000000 1235000000
PLS_INTEGER和BINARY_INTEGER
PLS_INTEGER和BINARY_INTEGER是plsql数据类型,无法在表中直接使用。在11g的官方文档中,官方指出PLS_INTEGER和BINARY_INTEGER两者是相同的,是有符号的整数类型,其取值范围为-2^31 ~ 2^31,共占用32个比特位。其内部存储格式,尚无资料表明,通过dump函数查看其为number类型,这可能是不正确的(补充:后来dump varchar2和nvarchar2数据类型时,其typ均为1,由此可见dump可能对相似的