programing

R의 MySQL에서 UTF-8 텍스트를 가져오면 "???"가 반환됩니다.

muds 2023. 9. 28. 08:51
반응형

R의 MySQL에서 UTF-8 텍스트를 가져오면 "???"가 반환됩니다.

나는 R에서 MySQL 데이터베이스의 UTF-8 텍스트를 가져오려다 막혔습니다.OS X에서 R(GUI와 명령줄을 통해 모두 시도)을 실행하고 있습니다. 여기서 기본 로케일은 en_US입니다.UTF-8, 어떤 시도를 해도 쿼리 결과에 ASC가 아닌 모든 것에 대해 "?"가 표시됩니다.2자.

설정을 해봤습니다.options(encoding='UTF-8'),DBMSencoding='UTF-8'ODBC를 통해 연결할 때, 설정Encoding(res$str) <- 'UTF-8'결과를 가져온 후, 그리고 각 결과의 'utf8' 변이체를 가져온 후, 모두 소용이 없었습니다.명령줄 mysql 클라이언트에서 쿼리를 실행하면 결과가 올바르게 표시됩니다.

저는 완전히 난처합니다.왜 작동이 안 되는지, 아니면 내가 시도해야 할 다른 것들이 있습니까?

다음은 상당히 최소화된 테스트 사례입니다.

$ mysql -u root
mysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE test (str VARCHAR(10)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO test (str) VALUES ('こんにちは');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+-----------------+
| str             |
+-----------------+
| こんにちは      |
+-----------------+
1 row in set (0.00 sec)

RODBC와 RMySQL을 모두 사용하여 R에서 테이블을 쿼리하면 "???" str 열의 경우:

> con <- odbcDriverConnect('DRIVER=mysql;user=root', DBMSencoding='UTF-8')
> sqlQuery(con, 'SELECT * FROM rtest.test')
    str
1 ?????
> library(RMySQL)
Loading required package: DBI
> con <- dbConnect(MySQL(), user='root')
> dbGetQuery(con, 'SELECT * FROM rtest.test')
    str
1 ?????

완성도를 위해, 여기 제 세션이 있습니다.정보:

> sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

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] RMySQL_0.9-3 DBI_0.2-5    RODBC_1.3-6 

@chooban 덕분에 접속 세션이 utf8이 아닌 latin1을 사용하고 있다는 것을 알게 되었습니다.제가 찾은 두 가지 해결책은 다음과 같습니다.

  • RMySQL의 경우 연결 후 쿼리 실행SET NAMES utf8연결 문자 집합을 변경합니다.
  • RODBC의 경우 다음을 사용하여 연결합니다.CharSet=utf8DSN 문자열에 저장됩니다.뛰지 못했습니다.SET NAMESODBC 경유로

이 질문은 나에게 올바른 방향을 가리켰습니다.

저는 이게 통했어요.전체 예시는 다음과 같습니다.

con = dbConnect(drv = MySQL(), user = user, password = password,
                dbname = dbname, host=host)

dbSendQuery(con, "SET NAMES utf8mb4;")
dbSendQuery(con, "SET CHARACTER SET utf8mb4;")
dbSendQuery(con, "SET character_set_connection=utf8mb4;")


dbGetQuery(con, "SELECT * FROM WHATEVER")

적어도 해볼 만한 것이 있습니다.연결 후 "'character_set_%'와 같은 변수 표시"를 실행하고 결과를 출력합니다.다른 방법이 없으면 지정한 문자 집합 옵션이 사용되었는지 확인하는 것이 유용합니다.

언급URL : https://stackoverflow.com/questions/12869778/fetching-utf-8-text-from-mysql-in-r-returns

반응형