Number overflow. Attempting to store a number with magnitude larger than supported range
TL;DR — 你的数字在 DynamoDB 的限制之外。N 类型持有最多 38 位精度,量级在大约 1E-130 到 9.9999…E+125 之间。超出该范围的值——或者有超过 38 个有效数字的值——会被以一个异常拒绝。把大 ID 和高精度值存储为字符串,而不是数字。
含义
ValidationException: 1 validation error detected: Number overflow. Attempting to store a number with magnitude larger than supported rangeDynamoDB 的 Number 类型是一个有界范围、38 个有效数字的十进制数。这个 ValidationException(HTTP 400)意味着你发送的值超过了那个量级——或者一个语言运行时把一个长数字字符串变成了一个溢出范围的浮点数。它作为数字不可重试;这个值必须以不同方式表示。
为什么会发生
- 一个真正巨大的数字——一个大于约
9.9E+125的值(或一个量级小于1E-130的正值)。 - 一个被解析为浮点数的长数字字符串——例如一个 120 位的账户/参考号经过
Number()/parseFloat()变成了类似8.04e+126的东西并溢出了。这是一个常见的现实触发因素。 - 超过 38 个有效数字——DynamoDB 的 Number 类型持有最多 38 位精度,超过它会导致一个异常。
- 一个计算出的值(一个乘积、一次幂运算)增长过了范围。
如何修复
- 把它存储为字符串(
S),而不是数字。 你从不对其做数学运算的大标识符、账户号或哈希应该是字符串——这同时绕开了量级限制和 38 位精度上限。 - 不要把类 ID 的字符串解析为数字——端到端地把一个 100 位的参考号保持为字符串。把它解析为浮点数正是产生溢出的原因。
- 让数字属性保持在范围内——DynamoDB Number 支持最多 38 位精度和到约
9.9E+125的量级。设计值使之适配,或者拆分/缩放它们。 - 对于高精度小数,把数字作为你从十进制类型(Python
Decimal、一个 big-decimal 库)转换来的字符串传入,这样精度在到达 DynamoDB 之前不会丢失。 - 通过存储为字符串来保留前导零/精确性——Number 类型会规范化,反正也无法保留前导零。
常见问题
DynamoDB 的数字限制是什么? Number 类型支持最多 38 位精度,量级从约 1E-130 到 9.9999999999999999999999999999999999999E+125(正值)以及它们的负值。超出该范围的值会引发 "Number overflow."。
我如何在 DynamoDB 中存储一个非常大的数字? 如果你不对它做算术,就把它存储为一个字符串(S)属性而非 Number(N)——这完全避免了 38 位精度上限和量级限制。对于可排序的数字字符串,把它们零填充,使字典序与数值序相符。
相关错误
- Float types are not supported. Use Decimal types instead——boto3 的精度对应项。
- One or more parameter values were invalid——更宽泛的值验证族。
- 学习:DynamoDB data types · Zero-padding sort keys
参考资料
- Supported data types and naming rules in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
- AttributeValue — Amazon DynamoDB API Reference
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。