cucumber flesh

Rを中心としたデータ分析・統計解析らへんの話題をしていくだけ

ODBCで取得したデータの文字化けを解決する

ODBCは良い。古事記には書かれていないかもしれないが、ホクソエムがそう言っている(意訳)。

qiita.com

最近になってR用のODBIインターフェイスである{odbc}パッケージがCRANに登録されたので、Rからも心置き無く使うことができるし、 今後ますます人気が出てくると思う。ただ、実際に使ってみるとnon-ASCII文字列では文字化けを起こす状態で残念な感じだった。

それをなんとかする方法。

# ユーザ名やパスワードはダミー
library(DBI)
# .connection_stringの内容を.odbc.iniに適宜書き込んでおくと省略できる
con <- dbConnect(odbc::odbc(), .connection_string = "Driver={MySQL ODBC 5.3 ANSI Driver};Uid=<ユーザ名>;Pwd=<パスワード>;Server=localhost;Port=3306;Database=<データベース>;CharSet=sjis;")
# この状態ではマルチバイト文字が文字化けしている
d <- con %>% dbReadTable("<テーブル>")
name type
1 ????????? place
2 ???? transportation
3 ??? place
4 ?????? place
d %<>% dplyr::mutate_if(is.character, stringi::stri_conv, 
    from = "sjis", to = "UTF-8")
name type
1 東京ディズニーシー place
2 横浜駅 transportation
3 兼六園 place
4 東京ソラマチ place

CharSetの値にsjisを指定し、R側の文字コード変換関数でUTF8にするという方法。{odbc}側で文字コード問題を解決してくれることを願うが、これで少なくとも日本語については文字化けに対処できる。

余談であるが、ODBCについて詳しく知りたい人は こちらの資料 “Database Best Practices”を見ると良い。これは先月行われたRStudio Conf2017での{odbc}パッケージの開発者であるJim Hesterのスライドである。また発表の様子が公開されているので動画と合わせて見ると良いかもしれない

Enjoy!