【问题标题】:R RpostgreSQL bigint datatypeR RpostgreSQL bigint 数据类型
【发布时间】:2013-10-03 21:01:47
【问题描述】:

我需要处理大整数,主键值1380742793415240。 在 R 中,我可以轻松调整选项(scipen=100),但我需要将该数据存储在 postgres db 中。 我已经尝试使用结果为 dbWriteTable 默认(双精度):违反约束(可能在 ...4e+015 表示中重复键),并且在将目标列更改为 bigint 后,结果为:invalid input syntax for integer: "1.38074279341524e+015"

示例:尝试在 dt 之后从 db 保存和加载

sample_dt <- data.table(a = c(20130101,20130102,20130102), 
                        b = c(1380742793415240,1380742793415241,1380742793415242))

在postgres中保存和加载这类数据的有效方法是什么?

【问题讨论】:

  • 另存为字符? (这是options',我想知道options(scipen=100) 是否真的在做你认为的那样。).Machine$integer.max &lt; 1380742793415240 [1] TRUE
  • 使用字符字段我将无法有效地查询sql &lt;- paste0("select * from tbl where b &gt;= '",one_id,"'")。并非所有 ID 都以 138 开头...,为了处理这种情况,我需要用零填充前导空格以使所有字符串都具有相同的 nchar。没有更优雅的解决方案来存储像212982,1380742793415240 这样的数字作为主键列并使用&gt; 运算符有效地查询它们???
  • 我真的不知道。我知道您提出的密钥不适合 R 的整数模式的约束。

标签: r bigint rpostgresql r-dbi


【解决方案1】:

这个主题在 RpostgreSQL 邮件列表上得到了很好的讨论和解决,如果有人遇到同样的问题,请链接它:https://groups.google.com/forum/#!topic/rpostgresql-dev/NDc7NfUP6M8
内容下方:

library(RPostgreSQL)
# Loading required package: DBI
c=dbConnect("PostgreSQL")
a <- 1380742793415240
b <- 1380742793415241
dc <-data.frame(a=as.character(a), b=as.character(b))
dbWriteTable(c,"testclosenumberch", dc)
# [1] TRUE
dbGetQuery(c, "select * from testclosenumberch")
#   row.names                a                b
# 1         1 1380742793415240 1380742793415241
dbGetQuery(c, "select a::bigint - b::bigint  from testclosenumberch")
#   ?column?
# 1       -1

【讨论】:

    猜你喜欢
    • 2011-01-04
    • 2018-07-29
    • 1970-01-01
    • 2023-03-29
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2012-07-20
    相关资源
    最近更新 更多