使用 sqlSave 保存到 ms sql 时,为什么 RODBC 会丢失我的数字列的精度?
数字
在 R 中,我使用数字列创建以下数据框。它们可能看起来已经是圆形的,但这是一个印刷问题,它们不是圆形的。
>test <- data.frame(
id=c(1,2,3),
numbers=c(12345678.90,12345678.91,12345678.92)
)
> str(test)
'data.frame': 3 obs. of 2 variables:
$ id : num 1 2 3
$ numbers: num 12345679 12345679 12345679
> test$numbers==123456789
[1] FALSE FALSE FALSE
将其保存到数据库中,似乎表明丢失了一些精度:
> dbconn <- odbcDriverConnect("driver={SQL Server};server=HOSTNAME\\SQL2014;database=test_db;trusted_connection=true")
> sqlSave(dbconn, test, fast=F, verbose=T)
Query: CREATE TABLE "test" ("rownames" varchar(255), "id" float, "numbers" float)
Query: INSERT INTO "test" ( "rownames", "id", "numbers" ) VALUES ( '1', 1, 12345679 )
Query: INSERT INTO "test" ( "rownames", "id", "numbers" ) VALUES ( '2', 2, 12345679 )
Query: INSERT INTO "test" ( "rownames", "id", "numbers" ) VALUES ( '3', 3, 12345679 )
通过从数据库中取回数据帧,我们可以验证精度确实丢失了:
> test2<-sqlFetch(dbconn, "test")
> test2
id numbers
1 1 12345679
2 2 12345679
3 3 12345679
> test2$numbers==12345679
[1] TRUE TRUE TRUE
float 似乎是正确的列类型,那么有没有办法强制rodbc 使用字符转换的替代方法?即使是默认的 as.character 也可以。
> as.character(test$numbers)
[1] "12345678.9" "12345678.91" "12345678.92"
日期
日期类列导致浮点类型的 ms sql 列,导致存储不正确的值:
> test <- data.frame(id=c(1,2,3),date=as.Date(c("2014-12-21","2014-12-22","2014-12-23")))
> sqlSave(dbconn, test, fast=F, verbose=T)
Query: CREATE TABLE "test" ("rownames" varchar(255), "id" float, "date" float)
Query: INSERT INTO "test" ( "rownames", "id", "date" ) VALUES ( '1', 1, 2014-12-21 )
Query: INSERT INTO "test" ( "rownames", "id", "date" ) VALUES ( '2', 2, 2014-12-22 )
Query: INSERT INTO "test" ( "rownames", "id", "date" ) VALUES ( '3', 3, 2014-12-23 )
> test2<-sqlFetch(dbconn, "test")
> test2
id date
1 1 1981
2 2 1980
3 3 1979
由于日期被解释为公式:
> 2014-12-21
[1] 1981
> packageVersion("RODBC")
[1] ‘1.3.10’