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