SQL Server decimal类型小数位超15位报错问题求助
问题根源
你遇到的Msg 8115算术溢出,核心是**decimal(18,15)**的精度配置问题:
- SQL里
decimal(p,s)的规则是:p表示总位数(整数+小数部分的数字个数),s是小数部分的位数 - 你设置的
p=18、s=15,意味着整数部分最多只能有18-15=3位数字 - 要插入的
38397是5位整数,远超3位上限,直接触发溢出报错
可行解决方案
1. 调整字段的decimal精度(首推)
直接修改表结构,给整数部分预留足够的位数。比如按照你要插入的数值,整数部分是5位,小数部分是8位,总位数设为13(5+8)就够,或者留些冗余设为decimal(20,8):
ALTER TABLE Table1 ALTER COLUMN rate decimal(20,8) NULL;
提示:调整前确认现有数据不会被截断,尽量根据业务实际的最大数值范围来设置,别盲目设太大(避免浪费存储空间)
2. 仅当无法改表时:调整插入的数值(不推荐)
如果因为权限或其他原因不能改表,只能对插入值做处理,但会丢失精度,且仅适用于整数部分不超3位的场景——你的情况整数部分已经超了,所以这个方法仅作参考:
-- 四舍五入到符合现有精度的数值(但你的整数部分超了,执行还是会报错,仅示例) INSERT INTO Table1 (id, description, rate) VALUES (1, 'My Room Upstair', ROUND(38397.0893181818, 15));
注意:这种方法本质是牺牲数据准确性换插入成功,业务上如果要求精确计算(比如费率、金额)绝对不能用
为什么别用Float?
Float是近似数值类型,存储的是二进制近似值而非精确值,插入后数值会发生不可逆的偏差,比如你插入的38397.0893181818存成Float后可能变成38397.089318181802,对需要精确计算的场景完全不适用,必须用decimal/numeric这种精确类型。
内容的提问来源于stack exchange,提问作者bebek tejo
相关产品推荐
相关产品推荐

