1. 程式人生 > >Oracle資料庫儲存number型別資料

Oracle資料庫儲存number型別資料

轉載自初一七月Oracle資料型別之number

oracle的number型別是oracle的內建型別之一,是oracle的最基礎數值資料型別。在9iR2及其以前的版本中只支援一種適合儲存數值資料的固有資料型別,在10g以後,才出現了兩種新的數值型別,即推出本地浮點資料型別(Native Floating-Point Data Types): BINARY_FLOAT(單精度32位)和BINARY_DOUBLE(雙精度64位). 這些新資料型別都是基於IEEE二進位制浮點運算標準,ANSI/IEEE Std 754-1985 [IEEE 754],使用這些型別時要加上文字f(BINARY_FLOAT)或者d(BINARY_DOUBLE),比如2.07f、3.000094d。

number資料型別

number型別的語法很簡單:number(p,s):
p:精度位,precision,是總有效資料位數,取值範圍是38,預設是38,可以用字元*表示38。
s:小數位,scale,是小數點右邊的位數,取值範圍是-84~127,預設值取決於p,如果沒有指定p,那麼s是最大範圍,如果指定了p,那麼s=0。
p:is the precision,or the total number of digits. Oracle guarantees the portability of numbers with precision ranging from 1 to 38.
s:is the scale, or the number of digits to the right of the decimal point. The scale can range from -84 to 127.

number型別的p和s,與其底層儲存完全沒有關係,根本不會影響資料在磁碟上如何儲存,它只會影響允許哪些值以及數值如何舍入,你可以認為其是對資料的“編輯”。簡單的說,精度位p表示數值最多能有多少個有效數字,而小數位s表示最多能有多少位小數。換句話說,p表示一共有多少位有效數字(即小數點左邊最多有p-s位有效數字),s表示小數點右邊有s位有效數字。如number(5,2)型別的資料,就表示小數點左邊最多有3位有效數字,右邊最多有2位有效數字,加起來就是最多有5位有效數字,超過這個範圍的數字就不能正確的儲存下來,注意這裡說的是不能正確儲存,但並不是不能儲存。

最高整數位數=p-s
s正數,小數點右邊指定位置開始四捨五入
s負數,小數點左邊指定位置開始四捨五入
s是0或者未指定,四捨五入到最近整數
當p小於s時候,表示數字是絕對值小於1的數字,且從小數點右邊開始的前s-p位必須是0,保留s位小數。

p>0,對s分2種情況:

  1. s>0
    精確到小數點右邊s位,並四捨五入。然後檢驗有效數位是否<=p;如果s>p,小數點右邊至少有s-p個0填充。
  2. s<0
    精確到小數點左邊s位,並四捨五入。然後檢驗有效數位是否<=p+|s|

具體資料可參考下表

參考栗子

裡面發生錯誤的行有的是因為源資料超過了可以表示的範圍,有的是因為進行小數四捨五入後超過了可以表示的範圍。