Итак, я некоторое время боролся с этим и, похоже, не могу найти выход из ситуации. Я пытаюсь прочитать файл. sql в R, я всегда так делаю, чтобы не вставлять более 100 строк sql в мои R-скрипты. Обычно я делаю это:
library(tidyverse)
library(DBI)
con <- dbConnect(<CONNECTION ARGUMENTS>)
query <- read_file("path/to/script.sql")
df <- as_tibble(dbGetQuery(con, query))
dbDisconnect(con)
Однако на этот раз в моем скрипте sql есть несколько символов Spani sh. Скажите что-то вроде этого:
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 = " ")
К сожалению, у меня нет базы данных publi c, чтобы предложить кому-либо, кто читает это. Я подключаюсь к базе данных postgreSQL 11.
--- ОБНОВЛЕНИЕ ----
Я на машине windows 10, с американским языком.
Когда я использую функцию read_file
, содержимое query
выглядит нормально, символы Spani sh распечатываются так, как должны, но когда я передаю его в dbGetQuery
, оно просто ничего не получает.
Я попытался принудительно применить кодировку "latin1", потому что я обнаружил в сети, что символы Spani sh обычно исправляются в R при этом. При этом символы Spani sh печатаются неправильно, поэтому я не ожидал, что это сработает, и это не так.
Значения символов в моей базе данных имеют кодировку '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)