Mysql decimal(m,d)的说明

本文作者通过亲身体验,详细解读了MySQL中decimal数据类型参数m和d的含义,探讨了decimal类型的存储机制及在精度要求高的场景下的应用实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看了一些博客,觉得很多都是复制的,不如自己亲测一篇:                          

create table decimal_test(
id int auto_increment PRIMARY key,
score decimal(5,2)  -- 取值范围是 -999.99 到 999.99
);

-- 整数的位数必须小于等于m-d,不然报错。小数的位数可以大于d位。多出d位时会做四舍五入,截取到d位。
-- 以上均不包括小数点、符号的位数。数字的总长度是m位,保存后的小数位最多是d位。如果保存后是整数,小数位不会补0。
-- 以下测试版本是5.7.14

select  *  from  decimal_test;
-- 正数:
insert into decimal_test(score) VALUES(1.23); -- 1.23
insert into decimal_test(score) VALUES(123.45); -- 123.45
insert into decimal_test(score) VALUES(123.455); -- 123.46
insert into decimal_test(score) VALUES(123.451); -- 123.45
insert into decimal_test(score) VALUES(123.451123); -- 123.45
insert into decimal_test(score) VALUES(12345.451123
### 用法 MySQL中的`DECIMAL`数据类型用于存储精确的小数值,适用于需要高精度的场景,例如财务数据的存储和计算。其基本语法为`DECIMAL(M, D)`,其中: - `M`表示总的数字个数(包括小数部分和整数部分),取值范围为1到65。 - `D`表示小数部分的数字个数,取值范围为0到30,并且不能超过`M`的值。 例如,`DECIMAL(5, 2)`表示最多可以存储5位数字,其中小数部分占2位,因此整数部分占3位。该类型的取值范围为-999.99到999.99。 在存储时,`DECIMAL`类型会按照指定的精度和小数位数存储数据,不会进行四舍五入,而是直接截断小数部分[^1]。 ### 存储方式 MySQL中`DECIMAL`类型的存储方式与其版本有关: - 在MySQL 3.23之前的版本中,`DECIMAL(M, D)`的每个值占用`M`字节,符号和小数点也包含在内。例如,`DECIMAL(5, 2)`占用5字节,取值范围为-9.99到99.99。 - 在MySQL 3.23及以后的版本中,`DECIMAL(M, D)`的取值范围等同于早期版本中的`DECIMAL(M + 2, D)`,并且存储空间更优化。例如,`DECIMAL(19, 9)`的小数部分需要4字节,整数部分的前9位需要4字节,剩余1位需要1字节,总共需要9字节[^2]。 如果`D`为0,则不存储小数点,这样可以增加存储的整数范围[^3]。 ### 精度和适用场景 `DECIMAL`类型适用于对精度要求较高的场景,例如货币计算、金融交易等。由于`DECIMAL`类型不会产生精度丢失问题,因此相较于`FLOAT`和`DOUBLE`类型,更适合存储精确的数值数据[^5]。 与`FLOAT`和`DOUBLE`不同,`DECIMAL`是定点数类型,其精度是固定的。例如,`DECIMAL(10, 2)`可以存储最多8位整数和2位小数,如12345678.99。 ### 示例 以下是一个使用`DECIMAL`类型的示例表定义: ```sql CREATE TABLE financial_data ( id INT PRIMARY KEY, amount DECIMAL(10, 2) ); ``` 在此定义中,`amount`列可以存储最多8位整数和2位小数的数值,例如12345678.99。 插入数据的示例: ```sql INSERT INTO financial_data (id, amount) VALUES (1, 12345678.99); ``` 查询数据的示例: ```sql SELECT * FROM financial_data; ``` ### 注意事项 - 在定义`DECIMAL(M, D)`时,需确保`M`足够大,以避免溢出。例如,若需要存储100000.99,则`DECIMAL(8, 2)`可以满足需求。 - 由于`DECIMAL`类型占用的存储空间较大,因此在对性能敏感的场景下需权衡是否使用该类型。 - 在涉及计算的场景中,`DECIMAL`类型能够保证较高的精度,而`FLOAT`和`DOUBLE`类型可能会导致精度丢失。 ### 总结 `DECIMAL`类型是MySQL中用于存储精确数值的重要数据类型,尤其适用于金融、财务等对精度要求高的场景。通过合理定义`M`和`D`参数,可以确保数据的准确性和存储效率[^4]。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十六画生的博客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值