DECIMAL 是 MySQL 中用于存储精确数值的数据类型,特别适合财务、货币等需要精确计算的场景。
基本语法
DECIMAL(M, D)
M (精度):总位数,范围 1-65(MySQL 5.0.3+),默认为 10
D (标度):小数位数,范围 0-30,且必须 ≤ M,默认为 0
特点
精确存储:与 FLOAT/DOUBLE 不同,DECIMAL 以字符串形式存储数字,避免浮点精度问题
固定精度:存储的值会精确到指定的小数位
四舍五入:插入的值如果小数位数超过 D,会进行四舍五入
补零:不足的位数会用零补齐
存储空间
DECIMAL 的存储空间取决于精度 M:
精度(M)范围 字节数
1-9 4
10-18 8
19-28 12
29-38 16
39-65 20
使用示例
-- 创建表时使用 DECIMAL
CREATE TABLE products (
id INT PRIMARY KEY,
price DECIMAL(10, 2), -- 总共10位,小数2位
weight DECIMAL(7, 3) -- 总共7位,小数3位
);
-- 插入数据
INSERT INTO products VALUES (1, 1234.56, 12.345);
INSERT INTO products VALUES (2, 99.995, 7.8999); -- 会四舍五入为100.00和7.900
-- 查询
SELECT * FROM products;
注意事项
如果插入的值整数部分超出 (M-D) 位,MySQL 会报错
DECIMAL 列的算术运算比整数或浮点数慢
在比较操作中,DECIMAL 比 FLOAT/DOUBLE 更可靠
从 MySQL 8.0.17 开始,DECIMAL 列允许的最大值为 10^65 - 1
与 NUMERIC 的关系
在 MySQL 中,DECIMAL 和 NUMERIC 是同义词,可以互换使用:
-- 以下两种定义等价
price DECIMAL(10, 2)
price NUMERIC(10, 2)
最佳实践
对于货币金额,推荐使用 DECIMAL(19,4)
根据实际需求选择适当的精度,避免过度分配
在需要精确计算的场景中优先使用 DECIMAL 而非 FLOAT/DOUBLE
DECIMAL 类型是 MySQL 中处理精确数值计算的重要工具,特别适合财务和科学计算等需要高精度的应用场景。