Tóm tắt
Kiểu DECIMAL(p,0) lưu số nguyên lớn hơn BIGINT. Độ chính xác tối đa p = 65 chữ số (65 chữ số 9).
Công thức lưu trữ
Số byte = (p DIV 9) + CEIL((p MOD 9) / 2)
-- Mỗi 9 chữ số dùng 4 byte, phần dư dùng 1-4 byte.
Ví dụ: DECIMAL(65,0)
CREATE TABLE DecimalDemo (UserId DECIMAL(65,0));
INSERT INTO DecimalDemo VALUES (99999999999999999999999999999999999999999999999999999999999999999);
-- 65 chữ số 9
Kết quả
+-------------------------------------------------------------------+
| UserId |
+-------------------------------------------------------------------+
| 99999999999999999999999999999999999999999999999999999999999999999 |
+-------------------------------------------------------------------+
Giới hạn
CREATE TABLE DecimalDemo1 (UserId DECIMAL(66,0));
-- ERROR 1426 (42000): Too-big precision 66 specified. Maximum is 65.
So sánh
| Kiểu | Max giá trị (unsigned) | Byte |
|---|---|---|
| TINYINT | 255 | 1 |
| SMALLINT | 65,535 | 2 |
| MEDIUMINT | 16,777,215 | 3 |
| INT | 4,294,967,295 | 4 |
| BIGINT | 18,446,744,073,709,551,615 (~1.8e19) | 8 |
| DECIMAL(65,0) | 10^65 - 1 (65 chữ số 9) | 29 |
Khi nào dùng DECIMAL(x,0)?
- Số nguyên cực lớn (ID phân tán, hash, khoa học, tài chính số lượng lớn).
- Cần độ chính xác tuyệt đối (không sai số float).
- Chấp nhận hiệu năng chậm hơn so với BIGINT.