? ? ?oracle數據庫中,number數據類型用來存儲數值數據,它既可以存儲負數數值,也可以存儲正數數值。相對于其他類型數據,number格式的數據底層存儲格式要復雜得多。今天我們就詳細探究下oracle的number底層存儲格式。
一、環境搭建
1.1,創建表
? ? 我們還是創建表t_code,并插入數據。
1.2,根據數據rowid,獲取數據文件號和數據塊id?
二、獲取底層存儲數據
2.1,dump數據塊
? ? 我們根據rowid得到的數據存儲的位置,通過oracle命令dump塊信息到日志。
?
2.2,dump函數獲取數據信息
?2.3,比對
? ? 我們根據dump出來的數據塊信息與dump函數信息比對,可以看到兩邊數據一致,那么我們直接用dump函數獲取數據分析:
三、存儲格式分析
3.1,詳細解析
? ? ?oracle內部,number數據類型的內部代表碼為2,也就是上面圖中的TYP=2。根據這個內部碼,oracle內部程序就知道該表該列的類型具體為什么。
? ? len=2,代表此列數據的長度為2。
? ? number數據類型底層存儲分為兩部分:一部分為指數字節位(占一個字節),其余為數字字節位(占多個字節),如:
Typ=2 Len=3: 194,4,3
? ? 指數字節位值為194;數字字節位值為:4,3?
? ? 指數字節位分為3部分:符號位,偏移量和指數值
? ? 符號位:符號位占一個bit位,位于byte的最高位。為1代表0或者正數,為0代表負數。
? ? 偏移量:偏移量默認值為65,二進制值為:1000001
? ? 指數值:指數值的范圍為-65...62,它需要byte位的實際值減去偏移量獲得。指數基數為100.
3.2,正數算法
? ? 我們以表t_code序號為302的數據進行計算底層數據存儲。
? ? 符號byte位值為194,二進制值為:11000010,可以看到:符號為1,所以為正數。
? ? 194-128=66,得到指數值為66,66的二進制值為1000010,減去65得到1(65+128=193)。所以最高位指數為1。
? ? 數字位基數為100,由于底層每個數字位加了1,故計算時候需要減1。
? ? 下面我們開始計算302數值如何得到:
3.3,負數算法?
? ? 我們以表t_code序號為-13596.1的數據進行計算底層數據存儲格式。
? ? 符號位值為60,故符號bit位位0,所以為負數。
? ? 負數的指數計算需要利用數值62(62+65=127),62為負數計算基數。62-60=2,所以最高位指數為2。
? ? 負數數值計算基數需要101減去對應數值位。
? ??