RODBC: Zeichen und Zahlen werden aggressiv konvertiert (mit / ohne as.is)
Im Zusammenhang mithttps: //stackoverflow.com/a/33284035/335827, Ich finde inkonsistentes Verhalten beim Abrufen von Daten von 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
n diesem Beispiel sehen wir das unerwünschte Verhalten: die Zeichen vonmychar
werden intern in ganze Zahlen konvertiert. Gemäß der zuvor erwähnten SO-Antwort ist dasas.is
-Option besiegt dies, hat aber den unglücklichen Nebeneffekt, dass auch dezimal dargestellte Gleitkommazahlen zu Zeichenfolgen gezwungen werden:
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"
Wenn mindestens eines vonmychar
ist eigentlich nicht ganzzahlig, die Dinge sind in Ordnung:
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
Leider unterstützt das Datenmodell nicht die willkürliche Hinzufügung von Elementen, um dieses Verhalten zu fördern (oder ich habe mir einfach keine gute Möglichkeit dafür ausgedacht). Das Datenmodell ist so, dass die Werte vonmychar
include01
und1
die zeichenweise verschieden sind. Die einzige Problemumgehung, die ich gefunden habe, ist die Verwendung vonas.is = TRUE
, was von mir verlangt wird,as.numeric
Alle verwandten Spalten, etwas, das sowohl mühsam als auch (theoretisch) unnötig ist.
Da die Dokumentation vorschlägt, dass Sie @ einstellen müssDBMSencoding
, Ich habe die aktuelle Kodierung überprüft (unterstützt vonhttps: //stackoverflow.com/a/5182469/335827):
sqlQuery(.conn, "SELECT SERVERPROPERTY('Collation')")
# 1 SQL_Latin1_General_CP1_CI_AS
Ich habe versucht mit (für Kicks):DBMSencoding="latin1"
, DBMSencoding="UTF-8"
und explizit obwohl der StandardDBMSencoding=""
ohne Verhaltensänderung.
Wie kann ich dazu anregen, die Datentypen nicht zu stark zu erzwingen?
Zurzeit mit R-3.2.5 und RODBC-1.3.13 auf Ubuntu.