oracle中dump函式及oracle NUMBER型別內部儲存機制
oracle中dump函式
轉自:http://blog.vsharing.com/nimrod/A654847.html
DUMP函式的輸出格式類似:
型別 ,符號/指數位 [數字1,數字2,數字3,......,數字20]
各位的含義如下:
1.型別: Number型,Type=2 (型別程式碼可以從Oracle的文件上查到)
2.長度:指儲存的位元組數
3.符號/指數位
在儲存上,Oracle對正數和負數分別進行儲存轉換:
正數:加1儲存(為了避免Null)
負數:被101減,如果總長度小於21個位元組,最後加一個102(是為了排序的需要)
指數位換算:
正數:指數=符號/指數位 - 193 (最高位為1是代表正數)
負數:指數=62 - 第一位元組
4.從開始是有效的資料位
從開始是最高有效位,所儲存的數值計算方法為:
將下面計算的結果加起來:
每個乘以100^(指數-N) (N是有效位數的順序位,第一個有效位的N=0)
5、舉例說明
SQL> select dump(123456.789) from dual; DUMP(123456.789) |
: 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) |
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
轉自
Internal representation of the NUMBER datatype
As with other datatypes, stored numbers are preceded by a length byte which stores the size of the datum in bytes, or 0xFF for NULLs. The actual data bytes for non-null numbers represent the value in scientific notation. For example, the number 12.3 is represented as +0.123 * 10². The high order bit of the first byte represents the sign. The sign bit is set for positive numbers; and clear for negative numbers. The remainder of the first byte represents the exponent, and then up to 20 bytes may be used to represent the significant digits excluding trailing zeros. This is sometimes called the mantissa.
Each byte of the mantissa normally represents two decimal digits. For positive numbers an offset of 1 is added to avoid null bytes, while for negative numbers an offset of 101 is added to the negated digit pair. Thus a mantissa byte with the decimal value of 100 might represent the digit pair "99" in a positive number, or the digit pair "01" in a negative number. The interpretation must be based on the sign bit. Negative numbers with less than 20 mantissa bytes also have a byte with the (impossible) decimal value 102 appended. I don't know what purpose this serves.
If there are an odd number of significant digits before the decimal point, the first mantissa byte can only represent 1 digit because the decimal exponent must be even. In this case, the 20-byte mantissa can represent at most 39 decimal digits. However, the last digit may not be accurate if a more precise value has been truncated for storage. This is why the maximum guaranteed precision for Oracle numbers is 38 decimal digits, even though 40 digits can be represented.
The decimal exponent is guaranteed to be even by the alignment of the mantissa. Thus the value stored for the exponent is always halved and is expressed such that the decimal point falls before the first digit of the mantissa. It again represents a pair of decimal digits, this time with an offset of 64 for positive numbers, and 63 for the negated exponent of negative numbers. Thus a set of exponent bits with the decimal value of 65 might represent the exponent +2 in a positive number, or the exponent -4 in a negative number. Please note that the encoding of the exponent is based on the sign of the number, and not on the sign of the exponent itself.
Finally, there are special encodings for zero, and . Zero is represented by the single byte 0x80. Negative infinity is represented by 0x00, and positive infinity is represented by the two bytes 0xFF65. These are illustrated in the listing below.
SQL> select n, dump(n,16) from special_numbers; N DUMP(N,16) --- ------------------------------------------ 0 Typ=2 Len=1: 80 -~ Typ=2 Len=1: 0 ~ Typ=2 Len=2: ff,65
For the rest, the best way to familiarize yourself further with the internal representation of numbers is to use the dump function to examine the representation of some sample values. This is simulated below. Just type a number and then press "Enter" to check out its representation. For example, try to find out why 110 takes one more byte of storage than 1100 despite being a smaller number.
Number: | ||
Representation: |
|
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-591127/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20190930]oracle number型別儲存轉化指令碼.txtOracle型別指令碼
- [20191003]oracle number型別儲存轉化指令碼.txtOracle型別指令碼
- [20191013]oracle number型別儲存轉化指令碼.txtOracle型別指令碼
- 【NUMBER】Oracle資料庫最佳化之理解NUMBER儲存機制Oracle資料庫
- ORACLE NUMBER資料型別Oracle資料型別
- Oracle的number資料型別Oracle資料型別
- Oracle基本資料型別儲存格式淺析——RAW型別Oracle資料型別
- [20191219]oracle timestamp資料型別的儲存.txtOracle資料型別
- 10_深入解析Oracle number資料型別及os層number解析工具分享Oracle資料型別
- 資料型別與函式索引-Oracle篇資料型別函式索引Oracle
- Oracle 隨機函式Oracle隨機函式
- [20241009]oracle timestamp with time zone資料型別的儲存.txtOracle資料型別
- [20190930]oracle raw型別轉化number指令碼.txtOracle型別指令碼
- MySQL 儲存函式及呼叫MySql儲存函式
- oracle 10g函式大全–日期型函式Oracle 10g函式
- Oracle中的正規表示式(及函式)詳解Oracle函式
- InnoDB儲存引擎鎖機制(二、 鎖的型別)儲存引擎型別
- oracle 函式Oracle函式
- oracle or 函式Oracle函式
- Oracle儲存過程Oracle儲存過程
- Block型別及儲存區域BloC型別
- [20191001]關於oracle number型別的一些疑惑.txtOracle型別
- Oracle中pivot函式詳解Oracle函式
- 工作中,Oracle常用函式Oracle函式
- Oracle中Decode()函式的使用Oracle函式
- Java HashMap原理及內部儲存結構JavaHashMap
- openGauss 函式及儲存過程支援函式儲存過程
- PostgreSQL:字元——型別及函式SQL字元型別函式
- 使用ORACLE ASMFD配置ORACLE儲存標準化OracleASM
- Oracle常用函式Oracle函式
- 7 Oracle 函式Oracle函式
- Oracle 字串函式Oracle字串函式
- Oracle 字串函式Oracle字串函式
- Oracle中rownum和row_number()Oracle
- Oracle 共享儲存掛載Oracle
- oracle的儲存過程Oracle儲存過程
- Oracle儲存過程-1Oracle儲存過程
- ORACLE日期型別Oracle型別
- 儲存機制