【问题标题】:How do I avoid a numeric data overflow如何避免数字数据溢出
【发布时间】:2013-05-16 16:21:45
【问题描述】:

我有一个在我们的旧 MySQL 数据库中运行良好的查询:

WHERE column_x + column_y > 524288000

现在我们已经迁移到 Redshift,查询失败:

ERROR: Numeric data overflow (addition)
  Detail: 
  -----------------------------------------------
  error:  Numeric data overflow (addition)
  code:      1058
  context:   
  query:     915381
  location:  numeric.hpp:112
  process:   query4_s0_22 [pid=6421]
  ----------------------------------------------- [SQL State=XX000] 

两列的类型均为bigint。在不添加列的情况下运行查询(仅检查一列或另一列),查询执行良好。我假设有些行 column_x + column_y 大于 bigint 的最大大小。

这里有什么解决方法?

【问题讨论】:

    标签: mysql amazon-redshift


    【解决方案1】:

    只需将加法改为减法:

    WHERE column_x > 524288000 - column_y
    

    【讨论】:

    • 这是一个适合我的聪明解决方案。虽然我应该提到,如果 column_y 可以有大量的负值,则存在潜在的失败案例。
    【解决方案2】:

    在比较之前乘以 1/x :)(除以 0 时会失败):

    WHERE column_x * (1/X) + column_y* (1/X) > 524288000* (1/X)
    

    【讨论】:

    • 2 应该作为你只添加两列
    【解决方案3】:
    WHERE column_x::numeric(20) + column_y::numeric(20) > 524288000
    

    【讨论】:

    • 谢谢,它仍然溢出,但后来我尝试明确设置大小,效果很好。一旦我的编辑被接受或做出其他澄清,我将接受这个答案。
    • @Dean 您的编辑未被接受,但我对其进行了编辑。它是这样工作的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2010-11-30
    • 2011-06-27
    相关资源
    最近更新 更多