Кодировка в ROracle

У меня проблемы с импортом норвежских символов, таких как æ, ø и å из базы данных Oracle с использованием ROracle. У меня были подобные проблемы с RODBC раньше. У меня нет проблемы при импорте из файлов, таких как csv и xlsx, я уверен, что проблема заключается в настройке кодировки при импорте с ROracle, но документация не говорит мне, как это сделать.

В различных ответах пишется функция для преобразования в UTF-8 после импорта, но это не решение, которое мне подходит. Я хочу делать запросы к оракулу БД, используя пакет dplyr, и мне нужно иметь возможность запрашивать, используя такие буквы, как æøå,

Вот моя строка подключения и SQL-запрос, который я использую в качестве теста:

library(ROracle)

drv <- dbDriver("Oracle", unicode_as_utf8 = TRUE, ora.attributes = TRUE)
# Create the connection string
host <- "xx.xxx.xx.x"
port <- xxxx
sid <- "xxxxxx"
connect.string <- paste(
  "(DESCRIPTION=",
  "(ADDRESS=(PROTOCOL=tcp)(HOST=", host, ")(PORT=", port, "))",
  "(CONNECT_DATA=(SID=", sid, ")))", sep = "")
con <- dbConnect(drv, username = "",
                 password = "",dbname=connect.string)

test <- dbGetQuery(con, "SELECT DECODE FROM T_CODE where key_id=17")

Это дает мне такие результаты: R?dgivningskontor

Вот моя сессия информация:

R version 3.5.0 (2018-04-23)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.4

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ROracle_1.3-1 DBI_1.0.0    

loaded via a namespace (and not attached):
[1] compiler_3.5.0 tools_3.5.0    yaml_2.1.19  

2 ответа

Я борюсь с этой проблемой в течение 2 дней, но я только что нашел решение.

Моя проблема заключалась в том, чтобы правильно отображать такие символы, как "ü" или "é" (в целях тестирования я также добавил "ø", который отображался как "?"). Я пытался установить переменную среды NLS_LANG разными способами и с разными наборами символов.

В конце концов, у меня были следующие шаги:

  1. Добавить NLS_LANG="AMERICAN_AMERICA.AL32UTF8" к .Renvironфайл. Это применимо в моем случае, когда база данных Oracle показывает NLS_CHARACTERSET=WE8ISO8859P15, а идентификатор локали на стороне клиента показывает en_US.UTF-8.
  2. Сохраните файл и перезапустите сеанс RStudio.

При повторном запуске и повторном запросе к базе данных символы на этом этапе отображались правильно.

Не могу комментировать, поэтому пишу это как ответ.

The .Renvironрешение работало для меня с испанской базой данных, но когда я использовал NLS_LANG="AMERICAN_AMERICA.AL32UTF8"У меня ошибка с паролем и логином.

Потом нахожу эту статью и наконец понял, мое решение было.

      # First with 'usethis' library create the .Renviron
library(usethis)
usethis::edit_r_environ()

# Then add the NLS_LANG in Renviron
# NLS_LANG=".WE8ISO8859P1"

# If for some reason Renviron wont load you can use this in your script
readRenviron("path_to_the_file/.Renviron")

Конечно, перезапустите RStudio, и я, наконец, смогу получить ñперсонаж вместо ?символ.

Благодаря @Ion Garaicoechea

Другие вопросы по тегам