我们如何定义大整数? [复制]

Posted

技术标签:

【中文标题】我们如何定义大整数? [复制]【英文标题】:How do we define large integers? [duplicate] 【发布时间】:2011-09-15 04:46:50 【问题描述】:

可能重复:Integer out of range on Postgres DB

当我的代码尝试将 100001857905525 等大数字插入 heroku 上的数据库时,我收到错误消息:

ActiveRecord::StatementInvalid (PGError: ERROR:  integer out of range ) 

该列已被定义为整数。我使用 sqlite3 数据库。我的代码已部署到 heroku。

当我在本地主机上运行时它工作正常。但是只有当我在 heroku 上运行代码时才会出现上述错误。 也许我可以通过将列定义为长整数或双精度来解决这个问题。我如何在 Ruby/Rails 中做到这一点?

【问题讨论】:

这个问题已经在这里被问及回答了***.com/questions/999570/… SQLite 非常宽容(即所有文本都是文本,因此对字符串大小没有限制,查看他们的datatypes 似乎 int 会根据需要增长到 8 位),但是 PostgreSQL(什么 Heroku uses) 已针对性能进行了优化,因此您必须找到正确的类型。这是一种引入在开发中有效但在生产中无效的代码的巧妙方式。 【参考方案1】:

在你的迁移中,你可以试试这个:

t.integer :uid, :limit => 8

这将产生一个 64 位整数列。

(根据PostgreSQL docs,仅integer 不指定limit 最多允许10 位数字。)

【讨论】:

像魅力一样工作。谢谢 列的默认值被设置为超过8位的数字,但它仍然可以工作,这是为列设置bigint的一种奇怪方式!更多信息请访问:moeffju.net/blog/using-bigint-columns-in-rails-migrations 我很好奇默认设置是什么。根据the docs,integer 的最大值为 2147483647(10 位),bigint 的最大值为 9223372036854775807(19 位)。 decimal 类型最多允许小数点前 131072 位!

以上是关于我们如何定义大整数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

牛客刷题-大整数相乘

大整数四则运算

大整数相乘问题总结以及Java实现

数学问题——大整数运算

大整数乘法(高精度乘法)

用数组表示大整数