使用西班牙字符(á、é、í、ó、ú、ñ 等)将 .sql 读入 R

Read .sql into R with Spanish characters (á, é, í, ó, ú, ñ, etc)

所以,我已经为此苦苦挣扎了一段时间,似乎无法 google 摆脱它。我正在尝试将 .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 并进行查询时,它 return 什么也没有,但是如果我将 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 = " ")

不幸的是,我没有 public 数据库可以提供给阅读本文的任何人。我正在连接到 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)

编码语句告诉 R 如何解释文件名,而不是它的内容。试试这个:

filetext <- readLines(file("path/to/script.sql", encoding = "latin1"))

有关详细信息,请参阅此答案:R: can't read unicode text files even when specifying the encoding

所以经过一段时间的思考,我想知道为什么 MrFlick 提出的解决方案不起作用。我检查了这个块创建的文件的编码:

query <- "select tree_id, tree from forest.trees where species = 'árbol'"
write_lines(query, "test.sql")

查看test.sql是什么编码,原来是ANSI,但看起来不对。所以我手动将我原来的 script.sql 编码更改为 ANSI。之后一切正常。

但是,当我在 ubuntu 环境中克隆我的存储库时,此解决方案不起作用。 ubuntu原来的'utf-8'编码没有问题。

希望这对 windows 中处理此问题的任何人有所帮助。