RODBC: caracteres e números convertidos agressivamente (com / sem as.is)
Relacionado ahttps://stackoverflow.com/a/33284035/3358272, Estou encontrando um comportamento inconsistente ao extrair dados do 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
Nesse exemplo, vemos o comportamento indesejado: os caracteres demychar
estão sendo convertidos internamente em números inteiros. De acordo com a resposta SO mencionada anteriormente, oas.is
A opção anula isso, mas tem o infeliz efeito colateral de também forçar flutuações representadas em decimais para cadeias:
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"
Se pelo menos um dosmychar
na verdade não é um número inteiro inteiro, tudo está bem:
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
Infelizmente, o modelo de dados não suporta a adição arbitrária de algo para incentivar esse comportamento (ou simplesmente não pensei em uma maneira suficientemente boa de fazê-lo). O modelo de dados é tal que os valores demychar
incluir01
e1
que são distintos em termos de caráter. A única solução alternativa que encontrei é usaras.is = TRUE
, o que exigirá que euas.numeric
todas as colunas relacionadas, algo que é um trabalho tedioso e (teoricamente) desnecessário.
Como os documentos sugerem a necessidade de definirDBMSencoding
, Verifiquei a codificação atual (ajudada porhttps://stackoverflow.com/a/5182469/3358272):
sqlQuery(.conn, "SELECT SERVERPROPERTY('Collation')")
# 1 SQL_Latin1_General_CP1_CI_AS
Eu tentei usar (para chutes):DBMSencoding="latin1"
, DBMSencoding="UTF-8"
e explicitamente embora o padrãoDBMSencoding=""
sem mudança de comportamento.
Como incentivar o comportamento de não coagir demais os tipos de dados?
Atualmente usando o R-3.2.5 e o RODBC-1.3.13 no ubuntu.