【问题标题】:Best data structure to store long strings of digits存储长数字串的最佳数据结构
【发布时间】:2021-01-12 07:20:50
【问题描述】:

我有一列数字(每个数字的最大长度为 14 位),每个数字中的每个字符都是数字(因此数字内没有字母或特殊字符)。

我尝试将数据类型 int4int8 分配给 numbers 列,并将表加载到 Redshift (PostgreSQL)。但是,我不断收到以下错误:

numeric value "9555739320" out of range for integer

这让我很困惑,因为我认为 int8 是 bigint 类型,它可以存储非常大的数字,如会话 8.1 中所述。此站点中的数字类型https://www.postgresql.org/docs/current/datatype-numeric.html。如果我的理解是正确的,为什么“9555739320”这个数字会超出范围?

对于将此数字列分配给什么数据类型有什么建议吗?假设某些数字可能有前导 0,例如“000223568960”,我想保留包括 0 在内的每个数字。

【问题讨论】:

  • "我认为 int4bigint 类型" - 这不是您链接的页面所说的。
  • 旁白:Redshift 不是 Postgres。它已经分叉了很长时间,并且从那时起差异一直在增长。 8.1 版的 Postgres 手册已经接近了它,但仍然相距甚远。坚持亚马逊为其产品提供的(劣质的,授予的)文档:docs.aws.amazon.com/redshift/latest/dg/welcome.html
  • @Bergi:在这种特殊情况下,OP 指向 8.1 手册而不是当前手册是有道理的。 (不过,对于实际问题来说都是一样的。)
  • @Bergi 感谢您了解这一点。我打了一个错字,意思是说“int8”。

标签: types numbers amazon-redshift sqldatatypes


【解决方案1】:

您的错误信息明确指出:

数值“9555739320”超出整数范围

“整数”。如果您实际上尝试分配给int8 列,则错误消息将显示“bigint”,而不是“integer”。除非它不会,因为 9555739320 很容易在 -9223372036854775808 到 9223372036854775807 的 bigint 范围内——就像你自己说的那样。

int8bigint 的别名。
int4 或只是 intinteger 的别名。

假设某些数字可能有前导 0,例如“000223568960”,我想保留包括 0 在内的每个数字。

如果您想保留可变数量的前导零,则不能使用任何numeric data types,它会修剪这些微不足道的噪音。请改用textvarchar

【讨论】:

  • 谢谢,@Erwin Brandsetter。有趣的是,我尝试分配列“文本”类型,但仍然无法正常工作。这次错误显示“数值“37167582983”超出整数范围”。我很困惑,因为我为它分配了“文本”类型,为什么它仍会将其视为“整数”。
  • @Stan:不会。在食物链中必须有另一个不必要的整数转换。找到它并消除它。确保您的(现在)字符串常量是正确的单引号。见:stackoverflow.com/a/12320729/939860
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
相关资源
最近更新 更多