ORACLE儲存之NUMBER型別

2021-06-19 01:54:39 字數 3568 閱讀 6090

這篇是關於oralce對number型別儲存方式的探析, 以及試圖對設計者的初始意圖進行解釋.

最近網上看了很多對

oracle

怎樣進行資料儲存描述的

,感覺都不好理解

,於是參照了很多文章

,自己琢磨了下幾種簡單資料型別的儲存

.number型別

oracle

對number

的儲存,

是按一定規則進行轉換以後以十六進製制儲存

(真正儲存當然是二進位制

,只是我們

dump

出來看到的是十六進製制)的

. oracle

資料庫中儲存的

number

型別包含

3個部分

: head

部分, data部分,

符號位.

對正數來說

,符號位省略,對

0來說,只有head即

80.首先來看幾個儲存的例子

,我們可以用

select

dump(89,

16)fromdual

來看到oracle

對number

型別實際儲存的結果

: typ=2 len=2:c1, 5a當然

,如果我們想看十進位制的,就用

select

dump(89,

10)fromdual

typ=2 len=2:193, 90

123 ->

c2, 2, 18

123.123->

c2, 2, 18, d, 1f

0 ->

80-123

->

3d, 64, 4e, 66

-0.123

->

3f, 59, 47, 66

head

部分為乙個位元組8位

,表示其大小[注:確切說表示數字或最高位,個、百、萬等整數字;百分位、萬分位、百萬分位等小數字]

,當然也包括正負

,就是前面看到的

c2, 3d.

因為設計這種儲存格式的時候

,希望以十六進製制

00-ff

來表示所有的

number,

所以為了編碼的對稱

,首先將

number

分為正負

,所以以

00-ff

的中間位置

80,也就是十進位制的

128來表示

0, head

部分小於

80,即為負數,大於

80即為正數.另

,乙個數

,都可以表示成

(+/-)a.b * 10

^(+/-)c,

(正/負)

a.b * 10

的(正/負)c次方

.所以, oracle

再次對00-80, 80-ff

進行對分

.00-3e

表示x <= -1        [注:即表示負數中的個、百、萬等整數字]

3f-7f

表示-1< x <0    [注:即表示負數中的百分位、萬分位、百萬分位等小數數字]

81-c0

表示0< x < 1     [注:即表示正數中的百分位、萬分位、百萬分位等小數數字]

c1-ff

表示1<= x         [注:即表示正數中的個、百、萬等整數字]

注:為什麼用1作為head的分割線呢,因為0.1=1*10^(-1);10=1*10^(+1);0.01=1*10^(-2);100=1*10^(+2)...也是對稱的然後,

我們再來看資料部分

, oracle

對十進位制的數字是兩位兩位進行儲存的

,例如對

1234, oracle

會分別對

12, 34

進行儲存

.所以只需要對

(+/-)1-99

進行編碼

1–99

分別用十六進製制

2–64

表示,即十進位制

2–100,換算式為x=y-1,

-1–-99

用十六進製制

64 – 2

表示,即十進位制

100–

2,換算式為x=y-101

而位數的話

,就分別以距

(+/-)1

[c1,

3e或十進位制62,193]

兩個標準

之差來表示

。至於符號位

,網上有人說是為了方便排序,

並且用的是

(+/-)1-99

都不可能用到的編碼

66(102)

來表示. 例如

123,

我們看為

(100+23),

最高位為百位,用0xc2表示;

資料部分用

(2, 18)表示,

就是(c2, 2, 18)

,轉換為十進位制為(194,2,24)。

123.123,

我們看為

(100+23+0.12+0.0030),

最高位為百位,同樣

head

部分為194

,資料部分成了

(2,24,13,31),

所以就是

(c2,2,18,d,1f)。

-123,

我們看為

(-100-23),

最高位是負百位,所以

head

為3d,即62-1 = 61

資料部分

為100-101,即64 和 78-101,即4e,

所以就是

(3d, 64, 4e, 66)

-0.123,

我們看為

(-0.12-0.0030),

最高位是

負百分位(沒有個分位),所以

head

為3f,即

62+1 = 63

資料部分為

(89,71),

所以就是

(3f, 59, 47, 66)

其餘可類推

,其逆過程也很容易知道了

.補充:dump(4100)的結果是0xc22a。

注意一點,如果數字最後數字上如果是0,oracle出於節省空間的考慮不會儲存。比如:4100只儲存百位上的41,12000000只儲存百萬位上的12,512000只儲存萬位上的51和百位上的20。

dump(132004078)的結果是0xc5022101294f。最高位是億位,因此用0xc5表示,億位上是1用0x02表示,百萬位上是32用0x21表示,萬位上是0用0x01表示,百位上是40用0x29表示,個位上78用0x4f表示。

注意:中間數字上的0不能省略。

ORACLE儲存之NUMBER型別

這篇是關於oralce對number型別儲存方式的探析,以及試圖對設計者的初始意圖進行解釋.最近往上看了很多對oracle怎樣進行資料儲存進行描述的,感覺都不好理解,於是參照了很多文章,自己琢磨了下幾種簡單資料型別的儲存.number型別 oracle 對 number 的儲存,首先是按一定規則進行...

Oracle的Number型數值儲存及轉換

我們可以通過dump函式來轉換數字的儲存形式,乙個簡單的輸出類似如下格式 sql select dump 1 from dual dump 1 typ 2 len 2 193,2 dump函式的輸出格式類似 型別 長度 符號 指數字 數字1,數字2,數字3,數字20 各位的含義如下 1.型別 num...

oracle 學習筆記 number

1 number可以儲存整數和非整數。儲存非整數時,數字的有效位數稱作精度,右邊的小數部分稱作刻度 小數字數 例如 數字 29.1963的精度為6,刻度為4。最大精度38,資料上顯示最大刻度可以為127,我本地測試也建立除了number 38,127 的字段,但是一直沒能成功插入數字。2 建立表 c...