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 数据类型 使用说明 #### 1. 基本概念 DECIMAL 类型用于存储具有固定精度的小数,适用于需要高精度计算的场景,例如金融交易或科学计算。它由两个参数定义:`M` 和 `D`,分别表示总位数和小数部分的位数[^3]。 #### 2. 定义语法 在创建表时,可以通过以下方式指定 DECIMAL 列: ```sql CREATE TABLE example ( value DECIMAL(M, D) ); ``` 其中: - `M` 表示总的数字位数(包括小数点前后的所有数字),范围为 1 至 65。 - `D` 表示小数点后的数字位数,范围为 0 至 30,并且必须满足 `D ≤ M`[^4]。 #### 3. 存储方式 DECIMAL 类型的数据是以字符串形式存储的,而不是浮点数的形式。这种方式确保了数值不会因为二进制转换而丢失精度。具体存储大小取决于 `M` 参数,即总共使用的字节等于 `(M + 2)/2` 向上取整的结果[^5]。 #### 4. 实际案例 假设需要存储金额字段,要求最多支持 8 位有效数字,其中小数点后保留两位,则可以这样定义列: ```sql amount DECIMAL(8, 2) ``` 如果插入值为 `999999.99`,则该值会被精确保存;但如果尝试插入超出范围的值(如 `1000000.00` 或更大数据),将会引发错误或被截断,这取决于 SQL 模式的设置[^1]。 #### 5. 特殊情况处理 当未显式声明 `D` 值时,默认情况下会采用零作为默认值,意味着此时仅能存储整数部分。另外需要注意的是,在某些旧版本中可能存在性能差异,因此建议根据实际需求合理规划数据结构设计[^2]。 ### 总结 通过上述介绍可以看出,MySQL 中的 DECIMAL 类型非常适合那些对准确性有严格要求的应用场合。由于其独特的存储机制,能够很好地避免传统浮点运算带来的误差问题。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

二十六画生的博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值