29

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

ODBC経由で接続するとき、結果をフェッチした後に設定options(encoding='UTF-8')すること、およびそれらのそれぞれの「utf8」バリアントを設定しようとしましたが、すべて役に立ちませんでした。コマンド ライン mysql クライアントからクエリを実行すると、結果が正しく表示されます。DBMSencoding='UTF-8'Encoding(res$str) <- 'UTF-8'

私は完全に困惑しています。なぜそれが機能しないのか、または私が試すべき他のことはありますか?

かなり最小限のテスト ケースを次に示します。

$ 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 
4

3 に答える 3

29

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

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

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

于 2012-10-13T13:56:04.663 に答える
5

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

于 2012-10-13T10:15:42.057 に答える