Oracle的NUMBER数据类型内部使用科学计数法以可变长度格式来存储数据。使用1B存储指数,而另外20B(可变)用于存储该数字剩下的部分。这种存储模式使得NUMBER数据类型可以表示的精度为38位。简单的对Oracle数字类型的存储特点进行简单探索。1.确定数字所占字节的大小可以使用vsize函数获得存储数字时占用的字节。SQL> select vsize(100) from dual;
VSIZE(100)
----------
2
表示在存储数字100时将会使用2B空间进行存储,其中1B用于存储数字,另外1B用于存储指数。
2.使用dump获取数字的具体存储信息
SQL> select dump(100) from dual;
DUMP(100)
------------------
Typ=2 Len=2: 194,2
3.Oracle NUMBER类型定义的不同形式
Oracle是使用精度(precision)和范围(scale)的方式来定义NUMBER数据类型的。如果使用特定的精度定义NUMBER,当超过所定义的精度时将会抛出“ORA-01438: value larger than specified precision allowed for this column”报错。具体举例如下。
1)定义精度为6,范围为2的字段进行测试
SQL> drop table t purge;
Table dropped.
SQL> create table t (x number(6,2));
Table created.
2)符合精度和范围时,成功插入
SQL> insert into t values(1234.56);
1 row created.
SQL> select * from t;
X
----------
1234.56
3)符合精度,但超出范围时,会四舍五入
SQL> insert into t values(123.456);
1 row created.
SQL> select * from t;
X
----------
1234.56
123.46
可见数字“123.456”已被四舍五入为“123.46”。
4)当超出精度时,将抛出ORA-01438错误
SQL> insert into t values(12345.67);
insert into t values(12345.67)
*
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
5)当定义数字类型时未给出范围的定义时,表示以整数形式存储
SQL> drop table t purge;
Table dropped.
SQL> create table t (x number(1));
Table created.
SQL> insert into t values (1.42312312321);
1 row created.
SQL> select * from t;
X
----------
1
SQL> insert into t values (1.52342341234);
1 row created.
SQL> select * from t;
X
----------
1
2
这里同样体现了四舍五入的原则。
4.小结
只要掌握了数字类型精度(precision)和范围(scale)的含义,便可以很好地理解Oracle NUMBER类型。
--转自