【发布时间】:2020-04-13 23:45:28
【问题描述】:
所以,我已经为此苦苦挣扎了一段时间,似乎无法通过谷歌搜索。我正在尝试将 .sql 文件读入 R,我总是这样做是为了避免在我的 R 脚本中放入 100 多行 sql。我通常这样做:
library(tidyverse)
library(DBI)
con <- dbConnect(<CONNECTION ARGUMENTS>)
query <- read_file("path/to/script.sql")
df <- as_tibble(dbGetQuery(con, query))
dbDisconnect(con)
但是,这次我的 sql 脚本中有一些西班牙字符。说这样的话:
select tree_id, tree
from forest.trees
where species = 'árbol'
当我将此脚本读入 R 并进行查询时,它不会返回任何内容,但如果我将 sql 脚本复制并粘贴到 R 字符串中,它就可以工作!所以看起来问题出在我将脚本读入 R 的那一行。
我尝试通过几种方式更改字符串的编码:
# none of these work
query <- read_file("path/to/script.sql")
Encoding(query) <- "latin1"
query <- readLines("path/to/script.sql", encoding = "latin1")
query <- paste0(query, collapse = " ")
很遗憾,我没有公共数据库可供阅读本文的任何人使用。我正在连接到 postgreSQL 11 数据库。
--- 更新 ----
我在使用美国语言环境的 Windows 10 机器上。
当我使用read_file 函数时,query 的内容看起来不错,西班牙文字符按应有的方式打印出来,但是当我将它传递给 dbGetQuery 时,它什么也得不到。
我尝试强制编码“latin1”,因为我在网上发现西班牙字符在这样做时往往会在 R 中修复。执行此操作时,西班牙字符打印错误,所以我没想到它会起作用,但它没有。
我的数据库中的字符值具有 'utf-8' 编码。
为了完全清楚,我阅读 .sql 脚本的所有尝试都没有奏效,但这确实有效:
library(tidyverse)
library(DBI)
con <- dbConnect(<CONNECTION ARGUMENTS>)
query <- "select tree_id, tree from forest.trees where species = 'árbol'"
# df actually has results
df <- as_tibble(dbGetQuery(con, query))
dbDisconnect(con)
【问题讨论】:
-
您在包含非 ASCII 字符的文件上使用了什么编码?你确定它是 latin-1 吗?你在 Windows 上吗?
query的内容看起来正确吗?您的数据库中的字符值是如何编码的? -
@MrFlick 我用所有信息更新了问题,感谢您的帮助!
-
好吧,如果你从有效的块中取出
query,然后执行write_lines(query, "test.sql"),然后将其读回并使用query <- read_lines("test.sql"); dbGetQuery(con, query)运行它,它是否有效?在 Windows 上,默认情况下一切都是 latin-1。您可能需要转换为 utf-8 才能使用数据库连接。在您尝试将其设置为“latin-1”之前,Encoding(query)会返回什么。 -
@MrFlick 我实际上已经尝试过了,但它没有用,我没有将它发布为我尝试过的东西,因为当我写这个问题时它听起来很愚蠢:P
-
Encoding(query)返回“UTF-8”
标签: r postgresql character-encoding odbc