代码之家  ›  专栏  ›  技术社区  ›  Justin Grant

数字类型的DynamoDB属性可以存储多少位整数数据?

  •  1
  • Justin Grant  · 技术社区  · 7 年前

    Number 类型支持38位十进制精度。这不足以存储需要39位数字的128位整数。对于无符号128位整数,最大值为340282366920938463463374607431768211455;对于有符号128位整数,最大值为170141183460469231731687303715884105727。这都是39位数字。

    我储存在一个仓库里 数字 ?

    1 回复  |  直到 7 年前
        1
  •  10
  •   Justin Grant    7 年前

    类型的DynamoDB属性 Number 可以存储126位整数(或127位无符号整数,有严重的警告)。

    根据亚马逊的 documentation

    数字的精度可达38位。超过此值将导致异常。

    这意味着(通过在AWS控制台中的测试验证)DynamoDB可以分别存储在 数字 属性是:

    999999999999999999999999999999999999999999(又名10^38-1) -999999999999999999999999999999999999999999(又名-10^38+1)

    使用以下公式,这些数字需要126位的存储空间:

    bits = floor (ln(number) / ln (2))
         = floor (87.498 / 0.693)
         = floor (126.259)
         = 126
    

    因此,您可以安全地在DynamoDB中存储126位有符号int。

    如果你想活得很危险,你可以储存127比特 未签名

    • 您需要避免(或者至少要非常小心)使用这样的数字作为排序键,因为最高有效位为1的值将作为负数排序。
    • 在DynamoDB中存储或查询未签名整数时,您的应用程序需要将其转换为已签名整数,并且在从DynamoDB读取数据后还需要将其转换回未签名整数。

    如果是我的话,我不会为了一点额外的理由去冒这些险。

    一个合乎逻辑的问题是,126(或127)是否足以存储UUID。答案是:视情况而定。如果您控制UUID的生成,那么您总是可以从UUID中删除一到两个部分并存储它。如果从4“版本”位刮除(请参阅格式 here

    但是,如果其他人正在生成这些uuid,并且希望使用无损存储,那么您可能无法使用 数字 存储UUID。但如果将客户机限制为4-8个白名单,则可以存储它 UUID versions . 现在最大的版本是0-15范围外的5,出于隐私原因,不鼓励使用某些旧版本,因此此限制可能是合理的,具体取决于您的客户端以及它们是否遵循中定义的版本位 RFC 4122

    顺便说一句,我很惊讶这个限制问题还没有上线。。。至少不是在一个容易用谷歌搜索的地方。那么,贡献这个Q&一对这样未来的搜索者才能找到它。