web-dev-qa-db-ja.com

RでMySQLからUTF-8テキストをフェッチすると、「????」が返されます。

RからMySQLデータベースのUTF-8テキストをフェッチしようとして立ち往生しています。OSXでRを実行しています(GUIとコマンドラインの両方で試しました)。デフォルトのロケールはen_US.UTF-8で、何を試しても、クエリ結果には「?」と表示されます。すべての非ASCII文字。

ODBC経由で接続するときにoptions(encoding='UTF-8')、_DBMSencoding='UTF-8'_を設定し、結果をフェッチした後に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があります:

_> 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 
_
28
Daniel Dickison

@choobanのおかげで、接続セッションでutf8ではなくlatin1が使用されていることがわかりました。これが私が見つけた2つの解決策です:

  • RMySQLの場合、接続後にクエリSET NAMES utf8を実行して、接続文字セットを変更します。
  • RODBCの場合、DSN文字列でCharSet=utf8を使用して接続します。 ODBC経由でSET NAMESを実行できませんでした。

この質問 私を正しい方向に向けました。

27
Daniel Dickison

少なくとも試してみることがあります。接続したら、「SHOW VARIABLES LIKE'character_set_% '」を実行して結果を出力します。他に何もない場合は、指定した文字セットオプションが使用されているかどうかを確認するのに役立ちます。

5
chooban

これは私のために働いた。完全な例を次に示します。

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")
1
marbel