[R] 한글 포함 UTF-8로 DB 읽어오기 (RMySQL, DBI)

반응형

R Image

* 전체 코드

install.packages("RMySQL") # RMySQL 설치
install.packages("DBI") # DBI 설치
library(DBI)
library(RMySQL)

# 문자열 컬럼에 대해 UTF-8로 인코딩
set_utf8 <- function(x) {
  chr <- sapply(x, is.character)
  x[, chr] <- lapply(x[, chr, drop = FALSE], `Encoding<-`, "UTF-8")
  Encoding(names(x)) <- "UTF-8"
  x
}

# Connect to the MySQL database: con
con <- dbConnect(RMySQL::MySQL() ,dbname, host, port, user, password)

## 한글도 읽어오게 하기
dbSendQuery(con, "SET CHARACTER SET utf8;")
df <- set_utf8(dbGetQuery(con, "SELECT * FROM __table1"))
Contents

     

    1. 배경

    R언어에서 RMySQL과 DBI를 이용해, DB에 Select 쿼리를 날려 테이블을 데이터프레임으로 읽어오는 방법에 대해 알아보겠습니다. 특히, 테이블에 한글이 있는 경우 깨지기 쉬운데, 이를 해결하는 방법도 같이 알아보겠습니다.

     

    2. 예시 설명

    1) 패키지 설치 및 Import

    install.packages("RMySQL") # RMySQL 설치
    install.packages("DBI") # DBI 설치
    library(DBI)
    library(RMySQL)

    DBI라이브러리는 dbConnect, dbListTables, dbSendQuery, dbGetQuery 등의 메소드를 가진 라이브러리입니다. RMySQL 라이브러리는 MySQL 기반 DB에 연결할 때 사용됩니다. 아래 예제에선, dbConnect메소드 내부에서 사용됩니다.

     

     

    2) UTF-8 인코딩 (한글 깨짐 방지)

    # 문자열 컬럼에 대해 UTF-8로 인코딩
    set_utf8 <- function(x) {
      chr <- sapply(x, is.character)
      x[, chr] <- lapply(x[, chr, drop = FALSE], `Encoding<-`, "UTF-8")
      Encoding(names(x)) <- "UTF-8"
      x
    }

    set_utf8이라는 함수를 정의했습니다. x(데이터프레임)을 입력받아서, sapply를 통해 각 컬럼이 문자열 컬럼인지를 반환하여 chr에 저장합니다. 그 후, lapply를 통해 각 컬럼의 인코딩을 "UTF-8"로 변환하여 다시 그 컬럼에 할당합니다. Encoding(names(x)) <- "UTF-8" 부분은 컬럼 이름도 "UTF-8"로 적용시키는 부분입니다. 마지막으로 그렇게 컬럼이름과 문자열로 된 모든 값을 UTF-8로 변환한 x를 반환하는 함수입니다.

     

    - sapply : simplify apply의 줄임말로, apply결과를 벡터 형태로 단순화해서 반환

    - lapply : list apply의 줄임말로, 리스트를 입력받아 apply를 실행하고, 그 결과를 list로 반환

     

    3) DB 연결 및 테이블 불러오기

    # Connect to the MySQL database: con
    con <- dbConnect(RMySQL::MySQL() ,dbname, host, port, user, password)

    dbConnect에 RMySQL을 인자로 넣어 MySQL DB에 연결합니다. dbname에 DB의 이름을, host에 ip주소를, port에는 포트번호를, user에는 DB의 ID를, password에는 DB의 비밀번호를 넣어줍니다.

    * 실행 화면

     

    4) 쿼리 날리기

    ## 한글도 읽어오게 하기
    dbSendQuery(con, "SET CHARACTER SET utf8;")
    
    ## Select문 실행
    df <- set_utf8(dbGetQuery(con, "SELECT * FROM __table1"))

    dbSendQuery(con, "SET CHARACTER SET utf8;")를 통해 DB의 캐릭터를 utf8로 설정하겠다는 쿼리를 보냅니다. 그리고, df <- set_utf8(dbGetQuery(con, "SELECT * FROM __table1"))를 통해 SELECT 쿼리를 db에 날려 그 결과를 받아오고 가져온 테이블에 set_utf8을 적용시켜 df에 넣어줍니다.

    * 실행 화면

    3. 결론

    보통 dbSendQuery(con, "SET CHARACTER SET utf8;")만 사용해도, 한글이 깨지지 않는 경우도 있는데, 그래도 한글이 깨지는 경우가 있어서 set_utf8 함수를 이용해 한글이 깨지지 않게 DB의 테이블을 불러오는 예제를 진행해보았습니다. 

    다음에 더 좋은 글로 찾아오겠습니다.
    읽어주셔서 감사합니다.

     

    Reference
    1. R Image : https://www.thoughtco.com/pronouncing-the-r-3079556
    반응형

    댓글

    Designed by JB FACTORY