Để lưu trữ số thập phân với độ chính xác rất cao (nhiều chữ số sau dấu phẩy), MySQL cung cấp kiểu DECIMAL(M, D) (còn gọi là NUMERIC).
- M (Precision): Tổng số chữ số tối đa (cả phần nguyên + phần thập phân). Max = 65.
- D (Scale): Số chữ số sau dấu phẩy. Max = 30, và D ≤ M.
Để lưu số có **20 chữ số sau dấu phẩy**, dùng DECIMAL(21,20) (1 chữ số phần nguyên + 20 chữ số thập phân).
Ví dụ minh họa
mysql> CREATE TABLE DemoTable1493 (
-> LongValue DECIMAL(21,20)
-> );
Query OK, 0 rows affected (0.48 sec)
mysql> INSERT INTO DemoTable1493 VALUES
-> (1.0047464644664677373),
-> (5.999999484757773),
-> (0.009994995885885);
mysql> SELECT * FROM DemoTable1493;
Kết quả – giữ nguyên độ chính xác:
+------------------------+ | LongValue | +------------------------+ | 1.00474646446646773730 | | 5.99999948475777300000 | | 0.00999499588588500000 | +------------------------+
So sánh với FLOAT/DOUBLE
| Kiểu | Lưu trữ | Độ chính xác | Phù hợp cho |
|---|---|---|---|
| FLOAT | 4 bytes | ~7 chữ số | Khoa học, đồ họa, dung sai |
| DOUBLE | 8 bytes | ~15 chữ số | Khoa học, tính toán chung |
| DECIMAL(M,D) | M/2 + 2 bytes (xấp xỉ) | Chính xác tuyệt đối (fixed-point) | Tài chính, tiền tệ, khoa học chính xác |
Lưu ý
- DECIMAL lưu trữ dưới dạng chuỗi số nén, tính toán chậm hơn FLOAT/DOUBLE nhưng **không bị sai số làm tròn**.
- Chọn M, D vừa đủ – quá lớn làm chậm và tốn lưu trữ.
- Với tiền tệ, phổ biến là
DECIMAL(19,4)hoặcDECIMAL(10,2).