向DECIMAL(4,3)列插入80.018后变为9.999,该现象原因是什么?
问题原因分析
这是因为你定义的DECIMAL(4,3)列类型的取值范围被忽略了,插入的值超出了它能容纳的最大值,MySQL自动将值截断到了该类型的上限9.999。
先搞懂DECIMAL(p,s)的参数含义
DECIMAL类型的格式是DECIMAL(p, s),其中:
p表示总位数(包含整数部分和小数部分的所有数字,不计算小数点),这里你设置的是4;s表示小数部分的位数,这里是3。
按照这个参数计算:整数部分允许的最大位数是 p - s = 4 - 3 = 1 位,也就是说这个列能存储的最大合法值是9.999(整数部分1位9,小数部分3位9)。
结合你的情况分析
你要插入的80.018,整数部分是两位(8和0),已经超过了DECIMAL(4,3)允许的1位整数上限。MySQL在遇到这种数值溢出的情况时,会默认把超出范围的值强制设置为该类型的最大值,也就是9.999——这就是你看到的结果。
验证与解决方案
- 你可以测试插入
9.999,它会被正常存储;如果插入10.000,同样会被截断为9.999。 - 如果需要存储像
80.018这样的数值,你需要调整列的类型,比如改成DECIMAL(5,3)(总位数5,小数3位,整数部分可容纳2位,最大能存99.999),或者根据实际业务需求设置更大的p值。
内容的提问来源于stack exchange,提问作者cojac
相关产品推荐
相关产品推荐

