Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

Data Type ที่ดีที่สุดสำหรับเก็บเงิน/สกุลเงินใน MySQL (DECIMAL)

ใช้ DECIMAL(Precision, Scale) เท่านั้น ห้ามใช้ FLOAT/DOUBLE (มี Floating Point Error)

หลักการ DECIMAL(M, D)

  • M (Precision) = จำนวนหลักทั้งหมด (1-65)
  • D (Scale) = จำนวนหลักหลังจุดทศนิยม (0-30, D ≤ M)
  • ตัวอย่าง: 345.66 → 5 หลักรวม, 2 หลักทศนิยม → DECIMAL(5,2)

ตัวอย่าง

mysql> CREATE TABLE MoneyRepresentation (
    -> Money DECIMAL(5,2)
    -> );

mysql> INSERT INTO MoneyRepresentation VALUES (345.66);
mysql> SELECT * FROM MoneyRepresentation;
+--------+
| Money  |
+--------+
| 345.66 |
+--------+

แนวทางเลือก Precision/Scale

Use CaseDECIMAL(M,D)Max ValueMin Increment
เงินบาท/เซ็นต์ (Thailand)DECIMAL(10,2)99,999,999.990.01
เงินดอลลาร์/เซ็นต์ (US)DECIMAL(10,2)99,999,999.990.01
Forex/Crypto (High Precision)DECIMAL(19,4) หรือ DECIMAL(20,8)9,999...99990.0001 / 0.00000001
Accounting (GAAP/IFRS)DECIMAL(15,2) - DECIMAL(19,4)Up to 999 Trillion0.01 / 0.0001

ทำไมไม่ใช่ FLOAT/DOUBLE?

mysql> SELECT 0.1 + 0.2;  -- 0.30000000000000004 (Floating Point Error)
mysql> SELECT CAST(0.1 AS DECIMAL(10,2)) + CAST(0.2 AS DECIMAL(10,2));  -- 0.30 (Exact)
Best Practice:
  1. Application Layer: ใช้ Decimal Type (Python decimal.Decimal, Java BigDecimal, JS decimal.js)
  2. Database: DECIMAL(M,D) เท่านั้น
  3. ไม่ควรเก็บเป็น Integer (Satang/Cents) แล้วคำนวณใน App (Error-Prone) - ยกเว้น High-Performance System ที่จัดการเอง