发新帖

[MySQL] MySQL decimal字段类型详解

零下一度 13天前 21

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 中处理精确数值计算的重要工具,特别适合财务和科学计算等需要高精度的应用场景。



最新回复 (0)
返回
零下一度
主题数
942
帖子数
0
注册排名
1