這篇是關於oralce對number型別儲存方式的探析, 以及試圖對設計者的初始意圖進行解釋.
最近往上看了很多對oracle怎樣進行資料儲存進行描述的, 感覺都不好理解, 於是參照了很多文章, 自己琢磨了下幾種簡單資料型別的儲存.
number型別
oracle
對 number
的儲存, 首先是按一定規則進行轉換以後以十六進製制儲存
( 真正儲存當然是二進位制
, 只是我們
dump
出來看到的是十六進製制
) 的.oracle資料庫中儲存的number型別包含3個部分: head部分, data部分, 符號位.
對正數來說, 符號位省略, 對0來說, 只有80.
首先來看幾個儲存的例子, 我們可以用
selectdump(89,
16)fromdual
來看到oracle對number型別實際儲存的結果: typ=2 len=2:c1, 5a
當然,如果我們想看十進位制的,就用
selectdump(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
然後,我們再來看資料部分, oracle對十進位制的數字是兩位兩位進行儲存的, 例如對1234, oracle會分別對12, 34進行儲存. 所以只需要對(+-)1-99進行編碼
1-99 分別用十六進製制2-64表示就是2-100x=y-1,
-1 – -99用十六進製制64 – 2表示就是100-2x=y-101
而位數的話, 就分別以距+-1兩個標準(為了方便,我們以下將以十進位制來看)3e, c1(62,193)之差來表示. 至於符號位, 網上有人說是為了方便排序, 並且用的是(+-)1-99都不可能用到的編碼66(102)來表示.
例如123, 我們看為(100+23), 比1要多乙個百位, 所以head表示為193 + 1 = 194
資料部分用(2, 24)表示, 就是(194,2,24), 轉換為十六進製制為(c2, 2, 18)
123.123, 我們看為(100+23+0.12+0.0030), 同樣head部分為194
資料部分成了(2,24,13,31), 所以就是(c2,2,18,d,1f)
-123, 我們看為(-100-23), 比1多乙個百位, 所以head為62-1 = 61
資料部分(64, 78), 所以就是(3d, 64, 4e, 66)
-0.123, 我們看為(-0.12-0.0030), 最高位比-1少乙個百分位, 所以head為62+1 = 63
資料部分為(89,71), 所以就是(3f, 59, 47, 66)
其餘可類推, 其逆過程也很容易知道了.
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...