Windows版ExploratoryでOracleの日本語データを読み込む方法

Windows版ExploratoryでOracleから日本語データを読み込んだときに日本語データが文字化けしてしまう問題の対処方法を説明します。

問題

こちらの手順に従ってOracle Instance ClientとODBCを利用してWindows版ExploratoryからOracle Databaseに接続したときに、以下の様に日本語データが文字化けして、?マークになってしまうことがあります。

原因

このパターンの文字化けは、Oracleデータベース側で、データがUTF-8で格納されているときに起きます。Windows版のRでは、一般的に、日本語を扱うときに、Windows Code Pageの一つとして扱うことが可能なSJISで扱ったほうがうまくいくケースがよくありますが、データベースから取り出されたデータがUTF-8だと、これをうまく処理できずに文字化けが発生してしまいます。

解決方法

Rにデータが渡ってくる前に、Oracle側で文字コードをSJISに変換してからデータを渡してくるように、Oracle Instant Clientを設定することで、この問題を回避します。

1. レジストリにNLS_LANG変数を設定する

レジストリエディター(regedit.exe)を起動して、HKEY_LOCAL_MACHINE/SOFTWAREの下にORACLEというキーを作成し、その下に文字列値NLS_LANGを作成し、値を.JA16SJISとします。

この状態でExploratoryでデータを読み直すと、おそらくまだ文字化けしていますが、以下の様に文字化けのしかたが変わることを確認してください。

2. 文字データをSJISからUTF-8に変換するスクリプトでデータを読み込む

ここで、Oracleデータベースからのデータの読み込みを、データベース・データソースからではなく、Rスクリプトデータソースから読み込むことでこの問題を回避します。 以下のようにRスクリプト・データソースのダイアログを開きます。

ここに以下のようなスクリプトを入力します。スクリプト中のDSN、ユーザー名、パスワード、SQL文などは適宜置き換えてください。

queryODBC(dsn = 'test_oracle', username = 'exploratory', password = '<password>', additionalParams = '', 
  query = 'select PRODUCT_ID, PRODUCT_NAME from PRODUCT_MASTER') %>%
  mutate_if(is.character, function(x){stringi::stri_conv(x, from="sijs", to="UTF-8")})

これを実行すると、以下のように文字データの文字化けが解消されます。

保存、または更新ボタンをクリックすると、データをインポートすることができます。