ใช้ 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 Case | DECIMAL(M,D) | Max Value | Min Increment |
|---|---|---|---|
| เงินบาท/เซ็นต์ (Thailand) | DECIMAL(10,2) | 99,999,999.99 | 0.01 |
| เงินดอลลาร์/เซ็นต์ (US) | DECIMAL(10,2) | 99,999,999.99 | 0.01 |
| Forex/Crypto (High Precision) | DECIMAL(19,4) หรือ DECIMAL(20,8) | 9,999...9999 | 0.0001 / 0.00000001 |
| Accounting (GAAP/IFRS) | DECIMAL(15,2) - DECIMAL(19,4) | Up to 999 Trillion | 0.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:
- Application Layer: ใช้ Decimal Type (Python decimal.Decimal, Java BigDecimal, JS decimal.js)
- Database: DECIMAL(M,D) เท่านั้น
- ไม่ควรเก็บเป็น Integer (Satang/Cents) แล้วคำนวณใน App (Error-Prone) - ยกเว้น High-Performance System ที่จัดการเอง