ODBCで取得したデータの文字化けを解決する
ODBCは良い。古事記には書かれていないかもしれないが、ホクソエムがそう言っている(意訳)。
odbc が CRAN に!https://t.co/hJHhJbeh4Q
— 門限のあるフレンズ (@hoxo_m) 2017年2月6日
最近になって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!