https://stackoverflow.com/a/33284035/3358272相关,我发现从SQL Server(2014)提取数据的行为不一致。

library(RODBC)
sqlQuery(.conn, "CREATE TABLE r2test ( [mychar] [NVARCHAR](16), [mynum] [FLOAT])")
# character(0)
sqlQuery(.conn, "INSERT INTO r2test (mychar,mynum) VALUES ('1',3.141593),('2',6.283185)")
character(0)
str(sqlQuery(.conn, "SELECT * FROM r2test", stringsAsFactors = FALSE))
# 'data.frame': 2 obs. of  2 variables:
#  $ mychar: int  1 2
#  $ mynum : num  3.14 6.28

在该示例中,我们看到了不良行为:mychar的字符正在内部转换为整数。根据前面提到的SO答案,as.is选项可以解决这个问题,但是不幸的是,它还强制将以十进制表示的浮点数强制为字符串:
str(sqlQuery(.conn, "SELECT * FROM r2test", stringsAsFactors = FALSE, as.is = TRUE))
# 'data.frame': 2 obs. of  2 variables:
#  $ mychar: chr  "1" "2"
#  $ mynum : chr  "3.1415929999999999" "6.2831849999999996"

如果mychar中至少有一个实际上不是整数可转换的,那么一切都很好:
sqlQuery(.conn, "INSERT INTO r2test (mychar,mynum) VALUES ('a',9.424778)")
# character(0)
str(sqlQuery(.conn, "SELECT * FROM r2test", stringsAsFactors = FALSE))
# 'data.frame': 3 obs. of  2 variables:
#  $ mychar: chr  "1" "2" "a"
#  $ mynum : num  3.14 6.28 9.42

不幸的是,数据模型不支持任意添加任何东西来鼓励这种行为(或者我只是没有想到一种足够好的方法来做到这一点)。数据模型使得mychar的值包括按字符区分的011。我发现的唯一解决方法是使用as.is = TRUE,这将要求我对所有相关列进行as.numeric,这既繁琐又(理论上)不必要。

由于文档建议需要设置DBMSencoding,因此我检查了当前的编码(由https://stackoverflow.com/a/5182469/3358272帮助):
sqlQuery(.conn, "SELECT SERVERPROPERTY('Collation')")
# 1 SQL_Latin1_General_CP1_CI_AS

我试过使用(踢):DBMSencoding="latin1"DBMSencoding="UTF-8"和显式的默认DBMSencoding="",但没有行为上的改变。

如何鼓励不过度强制数据类型的行为?

当前在ubuntu上使用R-3.2.5和RODBC-1.3.13。

最佳答案

如果我理解正确,那么我想如果您正在寻找什么,

str(sqlQuery(
  .conn,
  "SELECT * FROM r2test",
  stringsAsFactors = FALSE,
  as.is = c(TRUE, FALSE)
))
#'data.frame':  2 obs. of  2 variables:
# $ mychar: chr  "1" "2"
# $ mynum : num  3.14 6.28

其中as.is被指定为逻辑向量(必须与结果集中的列数具有相同的长度)。公平地说,这并不是很好地阐明。 sqlQuery的手册页仅将您引至as.is中的read.table参数,该参数指出:



这种方法的缺点是,您需要事先知道要转换的列和不需要的列。我个人不知道为什么默认行为不是仅将SQL字符类型映射为R字符类型,将SQL数字类型映射为R数字类型等,但是在后端可能有充分的理由。自动将'1''2',...转换为整数,对我来说,而不是似乎不是很多“功能”。

关于RODBC:字符和数字进行积极转换(有/无as.is),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38443157/

10-12 19:17
查看更多