Oracle的Number型數值儲存及轉換

2021-09-05 19:56:21 字數 2333 閱讀 6125

我們可以通過dump函式來轉換數字的儲存形式,乙個簡單的輸出類似如下格式:

sql> select dump(1) from dual;
dump(1)

------------------

typ=2 len=2: 193,2

dump函式的輸出格式類似:

型別 <[長度]>,符號/指數字 [數字1,數字2,數字3,......,數字20]

各位的含義如下:

1.型別: number型,type=2 (型別**可以從oracle的文件上查到)

2.長度:指儲存的位元組數

3.符號/指數字

在儲存上,oracle對正數和負數分別進行儲存轉換:

正數:加1儲存(為了避免null)

負數:被101減,如果總長度小於21個位元組,最後加乙個102(是為了排序的需要)

指數字換算:

正數:指數=符號/指數字 - 193 (最高位為1是代表正數)

負數:指數=62 - 第一位元組

4.從《數字1>開始是有效的資料位

從《數字1>開始是最高有效位,所儲存的數值計算方法為:

將下面計算的結果加起來:

每個《數字位》乘以100^(指數-n) (n是有效位數的順序位,第乙個有效位的n=0)

5. 舉例說明

sql> select dump(123456.789) from dual;
dump(123456.789)

-------------------------------

typ=2 len=6: 195,13,35,57,79,91

《指數》:   195 - 193 = 2

《數字1>    13 - 1    = 12 *100^(2-0) 120000

《數字2>    35 - 1    = 34 *100^(2-1) 3400

《數字3>    57 - 1    = 56 *100^(2-2) 56

《數字4>    79 - 1    = 78 *100^(2-3) .78

《數字5>    91 - 1    = 90 *100^(2-4) .009

123456.789

sql> select dump(-123456.789) from dual;
dump(-123456.789)

----------------------------------

typ=2 len=7: 60,89,67,45,23,11,102

《指數》     62 - 60 = 2(最高位是0,代表為負數)

《數字1> 101 - 89 = 12 *100^(2-0) 120000

《數字2> 101 - 67 = 34 *100^(2-1) 3400

《數字3> 101 - 45 = 56 *100^(2-2) 56

《數字4> 101 - 23 = 78 *100^(2-3) .78

《數字5> 101 - 11 = 90 *100^(2-4) .009

123456.789(-)

現在再考慮一下為什麼在最後加102是為了排序的需要,-123456.789在資料庫中實際儲存為

60,89,67,45,23,11

而-123456.78901在資料庫中實際儲存為

60,89,67,45,23,11,91

可見,如果不在最後加上102,在排序時會出現-123456.789<-123456.78901的情況。

對於2119號提問,第乙個問題是:

1.請問為什麼193,2各代表什麼意思?

從上面就可以看到答案了.

2.還有number數字型別為什麼有2個位元組的長度呢?

對於這個問題,我想我們應該知道,所有資料型別最終在計算機裡都以二進位制儲存,實際上所謂的資料型別都是我們定義的.所以儲存只由演算法決定.

所以這個問題是不成立的.比如:

sql> select dump(110) from dual;
dump(110)

---------------------

typ=2 len=3: 194,2,11

sql> select dump(1100) from dual;
dump(1100)

-------------------

typ=2 len=2: 194,12

我們會看到,雖然1100>110,但是儲存上1100卻只佔2位元組,而110卻佔了3個位元組.

有趣的數(number)

有趣的數 number 題目描述 這些天nodgd在研究一類有趣的數。定義函式 f n f n f n 表示 n n n 在十進位制表示下的數字之和。如果乙個正整數 n n n 滿足 f n n f n vert n f n n 則nodgd認為 n n n 是有趣的。例如 3 3 3,7 7 7,...

3762 有趣的數(number)

題意 記憶體限制 256 mib 時間限制 2000 ms 這些天nodgd在研究一類有趣的數。定義函式 f n f n f n 表示 n nn 在十進位制表示下的數字之和。如果乙個正整數 n nn 滿足 f n nf n vert n f n n 則nodgd認為 n nn 是有趣的。例如 3 3...

Oracle中的number型別

number型別的語法很簡單 number p,s p 精度位 有效數字位 precision,是總有效資料位數,取值範圍是38,預設是38,可以用字元 表示38。s 小數字,scale,是小數點右邊的位數,取值範圍是 84 127,預設值取決於p,如果沒有指定p,那麼s是最大範圍,如果指定了p,那...