Oracle中的Number類型

number數據類型

number類型的語法很簡單:number(p,s):
p:精度位,precision,是總有效數據位數,取值範圍是38,默認是38,能夠用字符*表示38。
s:小數位,scale,是小數點右邊的位數,取值範圍是-84~127,默認值取決於p,若是沒有指定p,那麼s是最大範圍,若是指定了p,那麼s=0。
p:is the precision,or the total number of digits. Oracle guarantees the portability of numbers with precision ranging from 1 to 38.
s:is the scale, or the number of digits to the right of the decimal point. The scale can range from -84 to 127.

number類型的p和s,與其底層存儲徹底沒有關係,根本不會影響數據在磁盤上如何存儲,它只會影響容許哪些值以及數值如何舍入,你能夠認爲其是對數據的「編輯」。簡單的說,精度位p表示數值最多能有多少個有效數字,而小數位s表示最多能有多少位小數。換句話說,p表示一共有多少位有效數字(即小數點左邊最多有p-s位有效數字),s表示小數點右邊有s位有效數字。如number(5,2)類型的數據,就表示小數點左邊最多有3位有效數字,右邊最多有2位有效數字,加起來就是最多有5位有效數字,超過這個範圍的數字就不能正確的存儲下來,注意這裏說的是不能正確存儲,但並非不能存儲。

最高整數位數=p-s
s正數,小數點右邊指定位置開始四捨五入
s負數,小數點左邊指定位置開始四捨五入
s是0或者未指定,四捨五入到最近整數
當p小於s時候,表示數字是絕對值小於1的數字,且從小數點右邊開始的前s-p位必須是0,保留s位小數。

p>0,對s分2種狀況:
1. s>0
精確到小數點右邊s位,並四捨五入。而後檢驗有效數位是否<=p;若是s>p,小數點右邊至少有s-p個0填充。
2. s<0
精確到小數點左邊s位,並四捨五入。而後檢驗有效數位是否<=p+|s|

具體數據可參考下表

Valuegit

Datatypethis

Stored Valuespa

123.2564orm

NUMBERci

123.2564it

1234.9876io

NUMBER(6,2)table

1234.99select

12345.12345數據類型

NUMBER(6,2)

Error

1234.9876

NUMBER(6)

1235

12345.345

NUMBER(5,-2)

12300

1234567

NUMBER(5,-2)

1234600

12345678

NUMBER(5,-2)

Error

123456789

NUMBER(5,-4)

123460000

1234567890

NUMBER(5,-4)

Error

12345.58

NUMBER(*, 1)

12345.6

0.1

NUMBER(4,5)

Error

0.01234567

NUMBER(4,5)

0.01235

0.09999

NUMBER(4,5)

0.09999

0.099996

NUMBER(4,5)

Error


裏面發生錯誤的行有的是由於源數據超過了能夠表示的範圍,有的是由於進行小數四捨五入後超過了能夠表示的範圍。 如下是一些例子1. s>0 精確到小數點右邊s位,並四捨五入。而後檢驗有效數位是否<=p; ZWF.YUDONG>create table t_n(id number(5,2)); Table created. ZWF.YUDONG>insert into t_n values(123.45); 1 row created. ZWF.YUDONG>insert into t_n values(123.455); 1 row created. ZWF.YUDONG>select * from t_n;         ID ----------     123.45     123.46 2 rows selected. ZWF.YUDONG>insert into t_n values(1.234); 1 row created. ZWF.YUDONG>select * from t_n;         ID ----------     123.45     123.46       1.23 3 rows selected. ZWF.YUDONG>insert into t_n values(.001); 1 row created. ZWF.YUDONG>select * from t_n;         ID ----------     123.45     123.46       1.23          0 4 rows selected. ZWF.YUDONG>insert into t_n values(1234.56); insert into t_n values(1234.56)                        * ERROR at line 1: ORA-01438: value larger than specified precision allowed for this column 若是s>p,小數點右邊至少有s-p個0填充。 ZWF.YUDONG>create table t_n(id number(4,5)); Table created. ZWF.YUDONG>insert into t_n values(1); insert into t_n values(1)                        * ERROR at line 1: ORA-01438: value larger than specified precision allowed for this column ZWF.YUDONG>insert into t_n values(.1); insert into t_n values(.1)                        * ERROR at line 1: ORA-01438: value larger than specified precision allowed for this column ZWF.YUDONG>insert into t_n values(.01); 1 row created. ZWF.YUDONG>commit; Commit complete. ZWF.YUDONG>select * from t_n;         ID ----------        .01 1 row selected. ZWF.YUDONG>insert into t_n values(.001); 1 row created. ZWF.YUDONG>insert into t_n values(.0001); 1 row created. ZWF.YUDONG>insert into t_n values(.00001); 1 row created. ZWF.YUDONG>insert into t_n values(.000001);   --超過刻度存儲0 1 row created. ZWF.YUDONG>select * from t_n;         ID ----------        .01       .001      .0001     .00001          0 10 rows selected. ZWF.YUDONG>col dp for a50 ZWF.YUDONG>select id,dump(id) dp,length(id),vsize(id) from t_n;  --vsize和dump的是字節數,length是數值實際位數(含小數點)         ID DP                                                 LENGTH(ID)  VSIZE(ID) ---------- -------------------------------------------------- ---------- ----------        .01 Typ=2 Len=2: 192,2                                          3          2       .001 Typ=2 Len=2: 191,11                                         4          2      .0001 Typ=2 Len=2: 191,2                                          5          2     .00001 Typ=2 Len=2: 190,11                                         6          2          0 Typ=2 Len=1: 128                                            1          1 5 rows selected. 2. s<0 精確到小數點左邊s位,並四捨五入。而後檢驗有效數位是否<=p+|s| ZWF.YUDONG>create table t_n(id number(5,-2)); Table created. ZWF.YUDONG>insert into t_n values(12345); 1 row created. ZWF.YUDONG>select * from t_n;         ID ----------      12300 1 row selected. ZWF.YUDONG>insert into t_n values(123456); 1 row created. ZWF.YUDONG>insert into t_n values(1234567); 1 row created. ZWF.YUDONG>select * from t_n;         ID ----------      12300     123500    1234600 3 rows selected. ZWF.YUDONG>insert into t_n values(12345678); insert into t_n values(12345678)                        * ERROR at line 1: ORA-01438: value larger than specified precision allowed for this column
相關文章
相關標籤/搜索