Oracle类型number与PG类型numeric对⽐和转换策略
Oracle 11g
number  任意精度数字类型
存储数据的范围
正数:1 x 10-130 to 9 x 10125 ,数据精度为38个有效数字
负数:-1 x 10-130 to 99 x 10125 ,数据精度为38个有效数字
零:0
⽆穷⼤:仅仅只可以从oracle 5中导⼊
描述
标度scale代表⼩数部分的数字位数,scale∈[-84,127],s缺省为0;
精度precision 代表所有数字的位数,precision∈[1,38],p缺省为最⼤限度内的任意值。
⼀般的精度可以⼤于等于标度,oracle中精度也可以⼩于标度,如numeri(3,6),该字段只能插⼊⼩于0.001的值,即0.0009,0.0008等等,⼩数点后尾数超出标度的位数将会四舍五⼊省去。
⼏个常见形式
Number 或者Number(*), (user_tab_column查询结果中data_precision =null,data_scale=null),此时可以存储极限内任意Precision和scale的值。
Number(*,scale), (user_tab_column查询结果中data_precision=null,data_scale=scale)此时可以存储极限内任意precision的值;    Number(precision), 此时scale缺省为0,等价于number(precision,0);
Number(precision,scale), precision∈[1,38],scale∈[-84,127]。
例⼦
Input Data Specified As Stored As
7,456,123.89NUMBER7456123.89
7,456,123.89NUMBER(*,1)
7,456,123.89NUMBER(9)7456124
7,456,123.89NUMBER(9,2)7456123.89
7,456,123.89NUMBER(9,1)
7,456,123.89NUMBER(6)(not accepted, exceeds precision)
7,456,123.89NUMBER(7,-2)7456100
我的个⼈测试例⼦(oracle Release 10.2.0.1.0)如下,得出⼩结论:number最多能存储126位整数(超出126位后会溢出报错),能准确存储最⾼40位的整数(⼤于40切⼩于等于126的整数,超出40位的部分四舍五⼊后补为0),当有整数和⼩数时,整数部分最多能准确存储38位。
SQL> create table test0(id int,num number);
表已创建。
SQL> insert into test0 values(1,123456789123456789123456789123456789123456789123
456789123456789123456789123456789123456789123456789123456789123456789123456789);--
126已创建 1 ⾏。
提交完成。
SQL> insert into test0 values(2,123456789123456789123456789123456789123456789123
4567891234567891234567891234567891234567891234567891234567891234567891234567891) ;--127
insert into test0 values(2,12345678912345678912345678912345678912345678912345678
91234567891234567891234567891234567891234567891234567891234567891234567891)
*
第 1 ⾏出现错误:
ORA-01426: 数字溢出
SQL> insert into test0 values(3,1234567891234567891234567891234567891234);--40
已创建 1 ⾏。
提交完成。
SQL> insert into test0 values(4,12345678912345678912345678912345678912345);--41
已创建 1 ⾏。
提交完成。
SQL> insert into test0 values(6,1234567891234567891234567891234567891234.567);--【40,3】已创建 1 ⾏。
提交完成。
SQL> insert into test0 values(7,123456789123456789123456789123456789123.4567);--【39,4】已创建 1 ⾏。
提交完成。
SQL> insert into test0 values(8,12345678912345678912345678912345678912.34567);--【38,5】已创建 1 ⾏。
提交完成。
SQL> select * from test0;
ID        NUM
---------- ----------
1 1.235E+125
3 1.2346E+39
4 1.2346E+40
6 1.2346E+39
7 1.2346E+38
8 1.2346E+37
通过JDBC获取到的数据是:
System.out.Int(1)+","+rs.getBigDecimal(2)+","+rs.getBigDecimal(2) .toString().length());
print
-----------------------------------------
1,12345678912345678912345678912345678912350000000000000000000000000000000000000000000000000000000000000000000000000000000000000 3,1234567891234567891234567891234567891234,40
4,12345678912345678912345678912345678912300,41
6,1234567891234567891234567891234567891235,40
7,123456789123456789123456789123456789123,39
8,12345678912345678912345678912345678912.35,41
Postgresql 9.3
Numeric 任意精度数字类型
存储空间:变长
描述:⽤户声明精度,位数精确。
范围:⼩数点以前最多 131072位,⼩数点以后最多16383 位。
标度(scale):是⼩数部分的位数,scale>=0
精度(precision):是全部数据位的数⽬,也就是⼩数点两边的位数总和。
仅⽀持精度>=标度。
例⼦:数字 23.5141 的精度为 6 ⽽标度为 4 。可以认为整数的标度scale为零。
常见形式:
numeric 字段的最⼤精度和最⼤标度都是可以配置的。要声明⼀个字段的类型为 numeric ,可以⽤下⾯的语法:
NUMERIC(precision, scale),其中precision>0,scale>=0。
NUMERIC(precision),此时即scale缺省为0,即等价于NUMERIC(pre3cision,0)。
NUMERIC不带任何精度与标度的声明,则创建⼀个可以存储⼀个直到实现精度上限的任意精度和标度的数值,⼀个这样类型的字段将不会
把输⼊数值转化成任何特定的标度,⽽带有标度声明的 numeric 字段将把输⼊值转化为该标度。
我的个⼈测试例⼦(postgresql9.3.4)如下,得出⼩结论:numeric不同于oracle的number,numeric能准确存储126位,甚⾄更⾼位
的数字。
jnggzy=> create table ttt1(id int, num numeric);
oracle四舍五入CREATE TABLE
jnggzy=> insert into ttt1 values(1,123456789123456789123456789123456789123456789 12345678912345678912345678912345678912345678912345678912345678912345678912345678
9);---126
INSERT 0 1
jnggzy=> insert into ttt1 values(1,123456789123456789123456789123456789123456789 12345678912345678912345678912345678912345678912345678912345678912345678912345678
9123456789);---135
INSERT 0 1
jnggzy=> insert into ttt1 values(3,1234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891 INSERT 0 1
jnggzy=> select * from ttt1;
id |                                                                  num
----+---------------------------------------------------------------------------
1 | 123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456  1 | 12345678912345678912345678912345678912345678912345678912345678912345678912345
6789123456789123456789123456789123456789123456  3 | 123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456 (3 ⾏记录)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。