這篇是關於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...