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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage