首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 數字型別三雄:NUMBER、BINARY_INTEGER、PLS_INTEGER 精度、效能與陷阱全解

     編輯:Oracle 資料庫基礎

三大型別定位

型別用途儲存格式運算引擎溢位行為精度範圍
NUMBER(p,s)資料欄、精確數值、浮點十進制可變長 (1~22 bytes)軟體模擬 (轉二進制運算)不溢位,四捨五入/報錯依規則1.0E-130 ~ 9.99E125 (38 位有效數字)
BINARY_INTEGERPL/SQL 整數變數、迴圈計數二進制補碼 (固定 4 bytes)軟體模擬**自動轉 NUMBER,不報錯**-2^31 ~ 2^31-1
PLS_INTEGERPL/SQL 高效整數變數二進制補碼 (固定 4 bytes)**硬體原生 (CPU 整數指令)****溢位報錯 (ORA-01426)**-2^31 ~ 2^31-1

NUMBER 精度與刻度 (p,s) 規則全解


NUMBER(p,s)
p = precision  (有效數字總位數,1~38)
s = scale      (小數點右邊位數,-84~127)

規則矩陣

情境規則結果
s > 0 (小數位)整數部位長度 > p-s → **ERROR**
小數部位長度 > s → **ROUND**
NUMBER(6,2) 存 12345.12 → ERROR (整數 5 位 > 4)
存 1234.9876 → 1234.99
s < 0 (捨入到小數點左)對小數點左 |s| 位進行四捨五入NUMBER(5,-2) 存 12345.58 → 12300
s > p小數點後第 s 位向左最多 p 位數字,超過 → ERROR;向右捨入NUMBER(4,5) 存 0.0123456 → 0.01235
存 0.1 → ERROR

實測案例速查

輸入值型別定義儲存結果說明
123.2564NUMBER123.2564無限制
1234.9876NUMBER(6,2)1234.99精確到分
12345.12345NUMBER(6,2)ERROR整數部位 5 位 + 小數 2 位 > 精度 6
1234.9876NUMBER(6)1235等同 NUMBER(6,0)
12345.345NUMBER(5,-2)12300百位四捨五入
12345678NUMBER(5,-2)ERROR8-2=6 > 5
123456789NUMBER(5,-4)123460000萬位四捨五入
0.1NUMBER(4,5)ERROR小數點後第 5 位向左需 1 位整數,但 0.1 整數部位為 0
0.01234567NUMBER(4,5)0.01235符合規則

NUMBER 三種宣告形式

  1. NUMBER(p,s):定點數,精度 p、刻度 s。
  2. NUMBER(p):整數,等同 NUMBER(p,0)。
  3. NUMBER:浮點數,精度 38,**刻度不固定**(非 s=0),可表示任意精度範圍內的值。

PLS_INTEGER vs BINARY_INTEGER:效能與安全的抉擇

  • 效能:PLS_INTEGER 硬體運算,**快 2~3 倍**,大量迴圈/運算首選。
  • 安全:BINARY_INTEGER 溢位自動轉 NUMBER 繼續執行(可能隱藏 Bug);PLS_INTEGER **立即報錯**,暴露邏輯錯誤。
  • 互操作:兩者可隱性轉換,但混用時以 PLS_INTEGER 行為為準(溢位報錯)。
  • 建議:**新代碼全面使用 PLS_INTEGER**;索引、計數器、整數參數、暫存變數。

進階:NUMBER 內部儲存與效能

  • 儲存採用 **基數 100 變長編碼**:1 位元組指數 + 最多 20 位元組尾數(每位元組 2 位十進制數字)。
  • 整數值佔用空間極小(如 1 佔 2 bytes),大數值佔用較大。
  • 運算時**轉換為內部二進制格式**,完成後再轉回十進制儲存,**CPU 開銷大於原生整數**。
  • **財務/會計精確計算必用 NUMBER**;科學計算/大量整數運算考慮 BINARY_DOUBLE/BINARY_FLOAT (IEEE 754) 或 PLS_INTEGER。

常見陷阱避坑

  1. 隱性轉換精度丟失:NUMBER(10,2) := 12345678.901 → 自動四捨五入為 12345678.90,無警告。
  2. 負刻度誤解:NUMBER(5,-2) 不是「小數點左 2 位」,而是「捨入到百位」。
  3. PLS_INTEGER 溢位中斷:批次迴圈計數器超過 21 億 → 直接報錯,改用 NUMBER 或分批。
  4. 主鍵用 NUMBER 無 precision/scale:ID NUMBER 允許任意精度,建議明確 NUMBER(18) 或 NUMBER(38) 便於 ORM 映射。

結語

Oracle 數字型體系:**NUMBER 為精確數值基石(金融級)、PLS_INTEGER 為高效整數引擎(PL/SQL 核心)、BINARY_INTEGER 為相容遺產**。掌握 p,s 精度規則、溢位行為差異、硬體 vs 軟體運算效能,並遵循「財務用 NUMBER、迴圈用 PLS_INTEGER、科學用 BINARY_DOUBLE」選型原則,即能寫出精確、高效、無驚喜的數值處理代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved