ORACLE數字演算法
建立一個表
SQL> create table testpp
2 (it number);
Table created
SQL> insert into testpp
2 values(100);
1 row inserted
計算器塊
SQL> select rowid from testpp;
ROWID
------------------
AAAXKYAABAAAU4aAAA
SQL> select dbms_rowid.rowid_relative_fno('AAAXKYAABAAAU4aAAA'),dbms_rowid.rowid_block_number('AAAXKYAABAAAU4aAAA') from testpp;
DBMS_ROWID.ROWID_RELATIVE_FNO( DBMS_ROWID.ROWID_BLOCK_NUMBER(
------------------------------ ------------------------------
1 85530
進行DUMP
SQL> alter system dump datafile 1 block 85530;
System altered
檢視其數字的dump格式
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f9a
avsp=0x1f83
tosp=0x1f83
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f9a
block_row_dump:
tab 0, row 0, @0x1f9a
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1
col 0: [ 2] c2 02 ----這裡就是DUMP出來的,長度是2
end_of_block_dump
End dump data blocks tsn: 0 file#: 1 minblk 85530 maxblk 85530
其實這裡的C2 02就是其具體的數字。使用DUMP函式也能得出
SQL> select dump(it,16) from testpp;
DUMP(IT,16)
--------------------------------------------------------------------------------
Typ=2 Len=2: c2,2
SQL> create table testpp
2 (it number);
Table created
SQL> insert into testpp
2 values(100);
1 row inserted
計算器塊
SQL> select rowid from testpp;
ROWID
------------------
AAAXKYAABAAAU4aAAA
SQL> select dbms_rowid.rowid_relative_fno('AAAXKYAABAAAU4aAAA'),dbms_rowid.rowid_block_number('AAAXKYAABAAAU4aAAA') from testpp;
DBMS_ROWID.ROWID_RELATIVE_FNO( DBMS_ROWID.ROWID_BLOCK_NUMBER(
------------------------------ ------------------------------
1 85530
進行DUMP
SQL> alter system dump datafile 1 block 85530;
System altered
檢視其數字的dump格式
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f9a
avsp=0x1f83
tosp=0x1f83
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f9a
block_row_dump:
tab 0, row 0, @0x1f9a
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1
col 0: [ 2] c2 02 ----這裡就是DUMP出來的,長度是2
end_of_block_dump
End dump data blocks tsn: 0 file#: 1 minblk 85530 maxblk 85530
其實這裡的C2 02就是其具體的數字。使用DUMP函式也能得出
SQL> select dump(it,16) from testpp;
DUMP(IT,16)
--------------------------------------------------------------------------------
Typ=2 Len=2: c2,2
然後透過ORACLE的演算法計算回去
SQL> select to_number('c2','xxxx') from dual;
TO_NUMBER('C2','XXXX')
----------------------
194
SQL> select to_number('2','xxxx') from dual;
TO_NUMBER('2','XXXX')
---------------------
2
其實這裡的如果換算為10進位制是
194,2
如果大於128 就是正數,小於128就是負數
指數是194-193=1
數字位1 是2-1=1*100^(1-0)=100 -1是因為正數+1儲存
所以數字也就還原為100
SQL> select (to_number('2','xxxx')-1)*power(100,to_number('c2','xxxx')-193) from dual;
(TO_NUMBER('2','XXXX')-1)*POWE
------------------------------
100
用SQL就是這樣,這是第一位
TO_NUMBER('C2','XXXX')
----------------------
194
SQL> select to_number('2','xxxx') from dual;
TO_NUMBER('2','XXXX')
---------------------
2
其實這裡的如果換算為10進位制是
194,2
如果大於128 就是正數,小於128就是負數
指數是194-193=1
數字位1 是2-1=1*100^(1-0)=100 -1是因為正數+1儲存
所以數字也就還原為100
SQL> select (to_number('2','xxxx')-1)*power(100,to_number('c2','xxxx')-193) from dual;
(TO_NUMBER('2','XXXX')-1)*POWE
------------------------------
100
用SQL就是這樣,這是第一位
在加入一個負數
SQL> insert into test
2 values(-123.333);
1 row inserted
SQL> commit;
Commit complete
SQL> insert into test
2 values(-123.333);
1 row inserted
SQL> commit;
Commit complete
進行DUMP如上
tab 0, row 1, @0x1f90
tl: 10 fb: --H-FL-- lb: 0x2 cc: 1
col 0: [ 6] 3d 64 59 59 47 66
進行計算
Typ=2 Len=6: 3d,64,59,59,47,66
SQL> select dump(it,16) from testpp;
DUMP(IT,16)
--------------------------------------------------------------------------------
Typ=2 Len=2: c2,2
Typ=2 Len=6: 3d,64,59,59,47,66 --66 及10進位制的102是一個排序位不用理會,用在負數的時候
內部儲存長度6 指數3d 後面數數字位
換算為10進位制就是
61,100,89,89,71,102
61是指數未
102 是排序位
中間的數字位
tab 0, row 1, @0x1f90
tl: 10 fb: --H-FL-- lb: 0x2 cc: 1
col 0: [ 6] 3d 64 59 59 47 66
進行計算
Typ=2 Len=6: 3d,64,59,59,47,66
SQL> select dump(it,16) from testpp;
DUMP(IT,16)
--------------------------------------------------------------------------------
Typ=2 Len=2: c2,2
Typ=2 Len=6: 3d,64,59,59,47,66 --66 及10進位制的102是一個排序位不用理會,用在負數的時候
內部儲存長度6 指數3d 後面數數字位
換算為10進位制就是
61,100,89,89,71,102
61是指數未
102 是排序位
中間的數字位
select -((101 - to_number('64', 'xxxx')) *
power(100, 62 - to_number('3d', 'xxxx')) +
(101 - to_number('59', 'xxxx')) *
power(100, 62 - to_number('3d', 'xxxx') - 1) +
(101 - to_number('59', 'xxxx')) *
power(100, 62 - to_number('3d', 'xxxx') - 2) +
(101 - to_number('47', 'xxxx')) *
power(100, 62 - to_number('3d', 'xxxx') - 3) )
from dual;
這樣數字就完成的轉換。
power(100, 62 - to_number('3d', 'xxxx')) +
(101 - to_number('59', 'xxxx')) *
power(100, 62 - to_number('3d', 'xxxx') - 1) +
(101 - to_number('59', 'xxxx')) *
power(100, 62 - to_number('3d', 'xxxx') - 2) +
(101 - to_number('47', 'xxxx')) *
power(100, 62 - to_number('3d', 'xxxx') - 3) )
from dual;
這樣數字就完成的轉換。
下面來自網路:
SQL> select dump(123456.789) from dual;
DUMP(123456.789)
-------------------------------
Typ=2 Len=6: 195,13,35,57,79,91
: 195 - 193 = 2
13 - 1 = 12 *100^(2-0) 120000
35 - 1 = 34 *100^(2-1) 3400
57 - 1 = 56 *100^(2-2) 56
79 - 1 = 78 *100^(2-3) .78
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,代表為負數)
101 - 89 = 12 *100^(2-0) 120000
101 - 67 = 34 *100^(2-1) 3400
101 - 45 = 56 *100^(2-2) 56
101 - 23 = 78 *100^(2-3) .78
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
現在再考慮一下為什麼在最後加102是為了排序的需要,-123456.789在資料庫中實際儲存為
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-756508/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE 數字演算法的C語言實現Oracle演算法C語言
- 演算法 猜數字演算法
- C++之數字計數演算法C++演算法
- 吸血鬼數字演算法演算法
- oracle sql去掉漢字保留數字或字母OracleSQL
- 演算法數字轉化為字串演算法字串
- Oracle常見數字函式Oracle函式
- oracle 一欄位 資料存在數字和漢字,只提取數字的sqlOracleSQL
- 每日一道演算法:羅馬數字轉整數演算法
- 演算法題:刪除 K 位數字演算法
- 關於oracle資料庫全形數字轉換半形數字方法Oracle資料庫
- 演算法微軟100題數字查詢演算法微軟
- 基於混沌的數字影像加密演算法加密演算法
- ORACLE從字串中過濾出數字~~Oracle字串
- 對金額數字擷取兩位小數的演算法演算法
- 演算法 | 數字影像處理之「中值濾波」演算法
- 聊聊四種Oracle數字取整函式Oracle函式
- 資料探勘——KNN演算法(手寫數字分類)KNN演算法
- 演算法學習-數字連續的子陣列演算法陣列
- JAVA加解密19-數字簽名演算法DSAJava解密演算法
- oracle 使用者密碼,以數字開頭Oracle密碼
- Oracle OpenWorld開幕前:有關OOW的有趣數字Oracle
- 每天一道演算法題系列十三之羅馬數字轉整數演算法
- KNN 演算法-實戰篇-如何識別手寫數字KNN演算法
- C++數字訊號處理演算法庫SP++C++演算法
- 給定數字生成中文數字(MySQL)MySql
- 缺失的數字;及找數字分析
- 演算法學習記錄02-判斷輸入數字是不是質數演算法
- 以猜數字遊戲引出的分治演算法的理解與思考遊戲演算法
- 演算法題:阿拉伯數字轉化為中文讀法演算法
- 數字影象處理之二維碼影象提取演算法(一)演算法
- 數字影像處理,經典對比度增強演算法演算法
- 找數字續;及缺失的數字分析
- 數字遊戲遊戲
- 數字加密加密
- 數字序列
- 中文數字阿拉伯數字相互轉換
- 數字格式字串轉數字保留後面0字串