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

MySQL NUMERIC 與 DECIMAL 類型深度對比:精度、存儲行為與實測差異

     編輯:MySQL 綜合教學

MySQL 中 NUMERIC 與 DECIMAL:同義詞關係、精度規則與邊界行為實測

官方文檔明確:NUMERIC 是 DECIMAL 的同義詞,兩者功能完全等效,用於**精確數值存儲** (定點數),避免浮點數誤差。

一、語法與精度規則

DECIMAL(M, D)  /  NUMERIC(M, D)
M (Precision): 總有效數字位數 (1~65,MySQL 5.0.6+),不含小數點與符號
D (Scale)    : 小數點後位數 (0~30,且 D ≤ M)
默認: DECIMAL(10,0)

規則:0 ≤ D ≤ M ≤ 65 (舊版本 M ≤ 38)。

二、存儲特性

  • **精確存儲**:不存近似值,適合貨幣、精確計量。
  • **壓縮存儲**:每 9 位數字佔 4 字節,餘數按位數分配字節,整數部分與小數部分分別壓縮。
  • **參數組合即類型**:DECIMAL(5,5) 與 DECIMAL(5,0) 是不同類型,CAST/CONVERT 間屬類型轉換。

三、實測驗證 (MySQL 5.0.45)

CREATE TABLE ta (a FLOAT, b DECIMAL(10,5));

-- 測試 1: 小數位超出截斷
INSERT INTO ta (a,b) VALUES (1, 12345.123423);
-- 實際存入 b: 12345.12342  (截斷不四捨五入)

-- 測試 2: 整數位超出範圍飽和
INSERT INTO ta (a,b) VALUES (1, 123456.1234);
-- 實際存入 b: 99999.99999  (整數部分 5 位上限 99999,小數位填滿 9)

四、結論總結

  1. NUMERIC = DECIMAL,MySQL 內部統一按 DECIMAL 處理 (SHOW CREATE TABLE 顯示均為 DECIMAL)。
  2. 整數位溢出:不報錯,直接飽和填充最大值 (如 99999.99999) — **靜默截斷風險大**,應用層必須校驗範圍。
  3. 小數位超出:直接截斷 (Truncate),**不四捨五入**。
  4. 貨幣場景建議:DECIMAL(19,4) 或 DECIMAL(15,2),覆蓋萬億級金額分精度。

五、類型轉換陷阱

  • DECIMAL → FLOAT/DOUBLE:可能損失精度。
  • INT/FLOAT → DECIMAL:超出範圍導致溢出 (報錯或飽和取決於 SQL Mode)。
  • 字符串字面量 12.345 自動轉為 DECIMAL(5,3) (最小精度)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved