Oracle類型number與PG類型numeric對比和轉換策略


Oracle 11g

number 任意精度數字類型

http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT313

存儲數據的范圍

正數:1 x 10-130 to 9.99...9 x 10125 ,數據精度為38個有效數字

負數:-1 x 10-130 to 9.99...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.89

NUMBER

7456123.89

7,456,123.89

NUMBER(*,1)

7456123.9

7,456,123.89

NUMBER(9)

7456124

7,456,123.89

NUMBER(9,2)

7456123.89

7,456,123.89

NUMBER(9,1)

7456123.9

7,456,123.89

NUMBER(6)

(not accepted, exceeds precision)

7,456,123.89

NUMBER(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.println(rs.getInt(1)+","+rs.getBigDecimal(2)+","+rs.getBigDecimal(2) .toString().length()); print ----------------------------------------- 1,123456789123456789123456789123456789123500000000000000000000000000000000000000000000000000000000000000000000000000000000000000,126 3,1234567891234567891234567891234567891234,40 4,12345678912345678912345678912345678912300,41 6,1234567891234567891234567891234567891235,40 7,123456789123456789123456789123456789123,39 8,12345678912345678912345678912345678912.35,41 

Postgresql 9.3

Numeric 任意精度數字類型

http://www.postgresql.org/docs/9.3/interactive/datatype-numeric.html#DATATYPE-NUMERIC-TABLE

存儲空間:變長

描述:用戶聲明精度,位數精確。

范圍:小數點以前最多 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); 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,123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789.123456789);--【135,9】 INSERT 0 1 jnggzy=> select * from ttt1; id | num ----+--------------------------------------------------------------------------- 1 | 123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789 1 | 123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789 3 | 123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789.123456789 (3 行記錄) 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM