如何使用RSQLite从数据库中检索大数字? (缓冲区溢出?)

时间:2015-09-05 23:04:21

标签: r database sqlite r-dbi

我有一个包含各种令牌和频率计数的数据库。当我尝试使用RSQLite从R中检索这些时,我得到低负数,因此可能存在缓冲区溢出问题。如果我在sqliteman中打开数据库并手动查询它,数据会正确返回,所以它必须与DBI或RSQLite有关。

有没有办法通过RSQLite检索非常大的整数/浮点值而没有这个问题?

这是一个最小的例子:

library("DBI"); library("RSQLite")
db.h <- dbConnect(RSQLite::SQLite(), dbname=":memory:")
dbGetQuery(db.h, "CREATE TABLE test (a TEXT, b INT)")
dbGetQuery(db.h, "INSERT INTO test VALUES ('value1',   282817178)")
dbGetQuery(db.h, "INSERT INTO test VALUES ('value2', 15620693910)")
result = dbGetQuery(db.h, "SELECT * FROM test")
result
dbDisconnect(db.h)

我得到的输出如下:

>        a           b
> 1 value1   282817178
> 2 value2 -1559175274

我在32位Windows 7上使用RStudio 0.98.501(R版本3.0.2),如果这完全相关的话。

编辑:请注意,SQLite 3对内存和请求处理中的所有值使用64位整数。如下面的评论中所建议的,使用BIGINT代替INT会产生相同的溢出问题。

1 个答案:

答案 0 :(得分:1)

This post on the RSQLite issue tracker表明这似乎是已知的实施问题/限制。它说这是(至少部分)与R不能很好地管理SQLite使用的64位整数。

这是一个似乎对我有用的解决方法:在SQL查询中将带有大整数的列转换为TEXT,然后在R中手动将其重新调整为数值。

工作示例:

library("DBI"); library("RSQLite")
db.h <- dbConnect(RSQLite::SQLite(), dbname=":memory:")
dbGetQuery(db.h, "CREATE TABLE test (a TEXT, b INT)")
dbGetQuery(db.h, "INSERT INTO test VALUES ('value1',   282817178)")
dbGetQuery(db.h, "INSERT INTO test VALUES ('value2', 15620693910)")
result = dbGetQuery(db.h, "SELECT a, CAST(b as TEXT) as b FROM test")
result$b <- as.numeric(result$b); result
dbDisconnect(db.h)

输出:

       a           b
1 value1   282817178
2 value2 15620693910