ปัญหา
DECIMAL(7) โดยไม่ระบุ scale = DECIMAL(7,0) → เก็บแค่จำนวนเต็ม ปัดทศนิยมทิ้ง
ตัวอย่างปัญหา
1. สร้างตาราง DECIMAL(7) - ไม่มี scale
mysql> create table stopRoundingDemo
-> (
-> Amount DECIMAL(7)
-> );
Query OK, 0 rows affected (0.67 sec)
2. Insert ค่าทศนิยม
mysql> insert into stopRoundingDemo values(7836.783); Query OK, 1 row affected, 1 warning (0.43 sec) mysql> insert into stopRoundingDemo values(1737.67); Query OK, 1 row affected, 1 warning (0.23 sec) mysql> insert into stopRoundingDemo values(110.50); Query OK, 1 row affected, 1 warning (0.33 sec)
มี Warning: Data truncated
3. ดูผล - ถูกปัดเป็นจำนวนเต็ม!
mysql> select * from stopRoundingDemo;
+--------+ | Amount | +--------+ | 7837 | | 1738 | | 111 | +--------+
แก้ไข: ระบุ Precision และ Scale
รูปแบบ: DECIMAL(precision, scale)
- Precision (M) = จำนวนหลักทั้งหมด (1-65)
- Scale (D) = จำนวนหลักทศนิยม (0-30, ต้อง ≤ M)
1. สร้างตารางใหม่ DECIMAL(10,4)
mysql> create table stopRoundingDemo2
-> (
-> Amount DECIMAL(10,4)
-> );
Query OK, 0 rows affected (0.81 sec)
2. Insert ค่าเดิม
mysql> insert into stopRoundingDemo2 values(7836.783); Query OK, 1 row affected (0.14 sec) mysql> insert into stopRoundingDemo2 values(1737.67); Query OK, 1 row affected (0.14 sec) mysql> insert into stopRoundingDemo2 values(110.50); Query OK, 1 row affected (0.16 sec)
3. ดูผล - เก็บทศนิยมครบ!
mysql> select * from stopRoundingDemo2;
+-----------+ | Amount | +-----------+ | 7836.7830 | | 1737.6700 | | 110.5000 | +-----------+
แนวทางเลือก Precision/Scale
| ใช้งาน | Precision,Scale | ตัวอย่าง |
|---|---|---|
| เงิน/สกุลเงิน | DECIMAL(10,2) หรือ DECIMAL(19,4) | 99999999.99 |
| เปอร์เซ็นต์/อัตรา | DECIMAL(5,4) | 99.9999% |
| พิกัด GPS | DECIMAL(9,6) หรือ DECIMAL(10,7) | 99.123456° |
| การวัดวิทยาศาสตร์ | DECIMAL(15,10) | แม่นยำสูง |
ALTER TABLE แก้ตารางเดิม
ALTER TABLE stopRoundingDemo MODIFY Amount DECIMAL(10,4);
หมายเหตุ: DECIMAL เก็บเป็น exact fixed-point ไม่มีปัญหา floating point error เหมาะสำหรับการเงิน