oracle number p,s 資料型別

2021-08-17 10:49:20 字數 2861 閱讀 8691



oracle的number型別是oracle的內建型別之一,是oracle的最基礎數值資料型別。在9ir2及其以前的版本中只支援一種適合儲存數值資料的固有資料型別,在10g以後,才出現了兩種新的數值型別。

oracle number型別能以極大的精度儲存數值,具體來說,精度可達38位。其底層資料格式類似於一種「封包小數」表示,這個在我的上篇文章

中已經做了闡述。oracle number型別是一種變長格式,長度0~22個位元組,是目前最為常用的數值資料型別。

number型別的語法很簡單:number(p,s):

p:精度位,precision,是總有效資料位數,取值範圍是38,預設是38,可以用字元*表示38。

s:小數字,scale,是小數點右邊的位數,取值範圍是-84~127,預設值取決於p,如果沒有指定p,那麼s是最大範圍,如果指定了p,那麼s=0。

很多人對這裡p和s的含義搞不清楚,以為可以儲存p個整數,s個小數。其實完全不是這樣的,number型別的p和s,與其底層儲存完全沒有關係,根本不會影響資料在磁碟上如何儲存,它只會影響允許哪些值以及數值如何捨入,你可以認為其是對資料的「編輯」。

簡單的說,精度位p表示數值最多能有多少個有效數字,而小數字s表示最多能有多少位小數。換句話說,p表示一共有多少位有效數字(即小數點左邊最多有p-s位有效數字),s表示小數點右邊有s位有效數字。如number(5,2)型別的資料,就表示小數點左邊最多有3位有效數字,右邊最多有2位有效數字,加起來就是最多有5位有效數字,超過這個範圍的數字就不能正確的儲存下來。

我們先模擬,精度位p完全正確的情況。

15:28:54 sql> create table t (a number(5,2));

table created.

elapsed: 00:00:00.01

15:28:57 sql> insert into t values(123.456);

1 row created.

elapsed: 00:00:00.00

15:29:00 sql> commit;

commit complete.

elapsed: 00:00:00.01

15:29:06 sql> select * from t;

a----------

123.46

elapsed: 00:00:00.00

可以看到數字被四捨五入了,一共只能有p=5位有效數字,小數點右邊最多只能存入s=2位有效數字,s對要存入的資料「123.456」做了四捨五入的「編輯裁剪」。

15:32:20 sql> create table t1 (a number(5,-2));

table created.

elapsed: 00:00:00.01

15:34:01 sql> insert into t1 values(123.45);

1 row created.

elapsed: 00:00:00.00

15:34:19 sql> insert into t1 values(12345.45);

1 row created.

elapsed: 00:00:00.00

15:34:30 sql> commit;

commit complete.

elapsed: 00:00:00.00

15:34:32 sql> select * from t1;

a----------

10012300

elapsed: 00:00:00.01

可以看到,當s<0時,其就表示小數點左邊最多能存入s=-2的絕對值2位有效數字,其實還是右邊s位(s=-2<0時反向變反),s對存入的資料「123.45」和「12345.45」都做了四捨五入的「編輯裁剪」得到number(5,-2)形式的「100」「12300」。

下面我們接著演示精度位p為不正確的情況。

15:38:28 sql> create table t2(a number(5,2));

table created.

elapsed: 00:00:00.01

15:39:21 sql> insert into t2 values(1234.56);

insert into t2 values(1234.56)

*error at line 1:

ora-01438: value larger than specified precision allowed for this column

elapsed: 00:00:00.01

15:39:35 sql> create table t3(a number(5,-2));

table created.

elapsed: 00:00:00.01

15:40:16 sql> insert into t3 values(12345678.9);

insert into t3 values(12345678.9)

*error at line 1:

ora-01438: value larger than specified precision allowed for this column

elapsed: 00:00:00.01

可以看到,上面的2種插入都失敗了,因為精度為p=5,s=2時,表示小數點左邊最多有p-s位,那麼第一種情況最多有是5-2=3位,而實際上有4位故出錯,第二種情況是最多有5-(-2)=7位,而實際上有8位故出錯。

通過上面的解釋,相信已經很明白number(p,s)中p和s的含義了,它們不影響底層資料的儲存,而只影響某個數字能否正確存入number(p,s)型別的列中(oracle會根據s來裁剪此資料,保證有效數字有p位,精確到小數點右邊s位)。

Catalan數(卡特蘭數)

卡特蘭數 規定h 0 1,而h 1 1,h 2 2,h 3 5,h 4 14,h 5 42,h 6 132,h 7 429,h 8 1430,h 9 4862,h 10 16796,h 11 58786,h 12 208012,h 13 742900,h 14 2674440,h 15 969484...

卡特蘭數 Catalan數

卡特蘭數 規定h 0 1,而h 1 1,h 2 2,h 3 5,h 4 14,h 5 42,h 6 132,h 7 429,h 8 1430,h 9 4862,h 10 16796,h 11 58786,h 12 208012,h 13 742900,h 14 2674440,h 15 969484...

Catalan數(卡特蘭數)

2012 04 12 21 08 13 標籤 卡特蘭數 原始出處 作者資訊和本宣告。否則將追究法律責任。卡特蘭數 規定h 0 1,而h 1 1,h 2 2,h 3 5,h 4 14,h 5 42,h 6 132,h 7 429,h 8 1430,h 9 4862,h 10 16796,h 11 58...