DECIMAL(M, D) ใช้เก็บตัวเลขทศนิยมได้แม่นยำ (Exact Value) ไม่มีปัญหา Floating Point Error
M= จำนวนหลักทั้งหมด (Precision) สูงสุด 65D= จำนวนหลักหลังจุดทศนิยม (Scale) สูงสุด 30 และ D ≤ M
ตัวอย่าง: เก็บเงินเดือน (สูงสุด 99,999.99)
mysql> CREATE TABLE EmployeeInformation (
-> EmpId INT AUTO_INCREMENT PRIMARY KEY,
-> EmpName VARCHAR(200),
-> EmpSalary DECIMAL(7,2) -- 7 หลักรวม 2 หลักทศนิยม
-> );
ทดสอบ Insert
mysql> INSERT INTO EmployeeInformation (EmpName, EmpSalary) VALUES ('John', 6999999.50);
ERROR 1264 (22003): Out of range value for column 'EmpSalary' at row 1 -- เกิน 7 หลัก
mysql> INSERT INTO EmployeeInformation (EmpName, EmpSalary) VALUES ('John', 69999.50); -- OK (5+2=7 หลัก)
mysql> INSERT INTO EmployeeInformation (EmpName, EmpSalary) VALUES ('Jane', 6999.50); -- OK
ผลลัพธ์ (MySQL ปัดเศษอัตโนมัติ):
+-------+---------+-----------+ | EmpId | EmpName | EmpSalary | +-------+---------+-----------+ | 1 | John | 70000.00 | | 2 | Jane | 7000.00 | +-------+---------+-----------+
แนวทางปฏิบัติ:
- เงิน/สกุลเงิน: ใช้
DECIMAL(19,4)หรือDECIMAL(10,2)ตามความต้องการ- ไม่ควรใช้ FLOAT/DOUBLE สำหรับเงิน (มีปัญหาความแม่นยำ)
- ใน Application ให้ใช้ Library Decimal (เช่น Python decimal, Java BigDecimal) ก่อน Insert