7

RODBCを使用してRからGreenPlumPostgreSQLデータベースに接続すると、これまでに発生したことのない新しいエラーが発生します。EMACS / ESSとRStudioの両方を使用してエラーが発生しましたが、RODBC呼び出しは以前と同じように機能しました。

library(RODBC)
gp <- odbcConnect("greenplum", believeNRows = FALSE)
data <- sqlQuery(gp, "select * from mytable")

> data
[1] "22P05 7 ERROR: character 0xc280 of encoding \"UTF8\" has no equivalent in  "WIN1252\";\nError while executing the query" 
[2] "[RODBC] ERROR: Could not SQLExecDirect 'select * from mytable'"

編集:別のテーブルにクエリを実行してみたところ、結果が得られました。したがって、これはRODBCの問題ではなく、PostgreSQLのテーブルエンコーディングの問題だと思います。

R version 2.13.0 (2011-04-13)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RODBC_1.3-2
> 
4

4 に答える 4

4

まず、RがUTF8をサポートするWindowsロケールに変換しようとしているために問題が発生します。残念ながら、Brian Ripleyは、WindowsにUTF8ロケールがないことを何度も報告しています。Web、StackOverflow、Microsoftなどの検索に費やした時間から、MicrosoftはUTF- 8WindowsがUTF8をサポートしないことを嫌っているという結論に達しました。

結果として、解決策があるとしても、これに対する簡単な解決策があるかどうかはわかりません。私がお勧めできる最善の方法は、サーバー側で何らかの変換をラップするか、可能であればデータのフィルタリングを検討するか、必要に応じて別の言語(中国語、日本語、韓国語など)を試すことです。

コンバーターをラップすることにした場合、unicode.orgは このICUツールキットをお勧めします。

于 2011-08-23T21:40:37.450 に答える
3

0xc280 は制御要素 (Unicode では U+0080) で、SQL などを使用するときにかなり頻繁に問題を引き起こしています。問題は多くの場合、さまざまなエンコード スキームを使用するさまざまなアプリケーションを使用するときに常に発生する変換チェーンにあります。Windows には現在 UTF-8 が含まれているため、厳密には Windows の問題ではありません。Rがデータを読み込む前に問題が発生すると思います。

実際、チェーンでは、UNICODE の文字シーケンス 0x80 が UTF-8 の 0xc280 にマップされます。これは制御シーケンスであると想定されており、印刷できません。しかし、0x80 が実際には UNICODE ではなく、Windows Latin-1 または Latin-2 である可能性は非常に高いです。その場合、0x80 はユーロ記号を表します。それは、それがあなたのデータでどのようになるかを説明するかもしれません. データにそのようなものがあるかどうかを確認してください。それはすでに何かを説明しています。

私の推測では、解決策はこのワークチェーンの R エンドではなく、その前にあると思います。自動変換を試みますが、これは場合によっては失敗することが報告されています (SQL と Oracle の場合も同様です)。Postgresql でどのエンコーディングを使用しているかを確認し、任意のラテン型を使用してみてください。他のリンクが関係している可能性があります (たとえば、Putty または同様の端末)。そこにあるすべてのエンコーディングは、Latin-1 である ISO8859-1 であると確信しています。どこかで UTF-8 がスローされ、0x80 文字が間違って 0xc280 にマップされると、問題が発生します。

したがって、完全なワークチェーンのエンコーディングをチェックし、それらがすべて一致していることを確認してください。そうでない場合、各ステップ間で行われる自動変換により、一部の文字に問題が発生する可能性があります。

お役に立てれば。

于 2011-08-24T01:06:22.560 に答える
1

この回答を他の場所に投稿したかもしれませんが、ここに行きます。

MS SQL 管理クライアントから Postgres DB に接続すると、同様のエラーが発生します。私の場合、ソースデータを修正するのはほとんど不可能です。

私のシナリオ:

  1. ODBC システム DSN 経由で MS SQL リンク オブジェクトを使用して Postgress に接続しようとすると、「エラー: エンコーディング "UTF8" の文字 0xc280 は "WIN1252" に相当するものはありません。
  2. 一部のテーブルの Select ステートメントは機能し、他のテーブルはこのエラーをスローします。

修正: Unicode をサポートする ODBC ドライバーを使用します。PostgreSQL Global Development Group の ODBC ドライバーを使用しています。DSN の構成/DSN の管理に移動し、Unicode ドライバーを選択します。

幸運を。

于 2013-10-04T20:34:25.247 に答える
0

デフォルトでは、Greenplumは文字エンコードにUTF8を使用します。これを確認するには、Greenplumサーバーにログインし、psql(Greenplumのコンソールクライアント)を起動します。このコンソールアプリケーションでは、コマンドを発行できます\l。Greenplumで構成されているすべてのデータベースを一覧表示します。これは、データベースの文字セットも記述している必要があります。

問題は、RがcharsのUTF8をサポートしていないことだと思います(異なるロケールを使用します)が、ODBCドライバーでオンザフライトランスコーディングを使用できます。すべてのODBCドライバーについてはわかりませんが、DataDirectドライバーはodbc.iniファイル(通常はユーザーのホームディレクトリにあります)の追加オプションをサポートしています-IANAAppCodePage。

このパラメータの適切なコードは、次のリンクにあります:http: //www.iana.org/assignments/character-sets

ODBC.iniコンテンツの例を次に示します。

[ODBC]
Driver=/opt/odbc/lib/S0gplm60.so
IANAAppCodePage=2252
AlternateServers=
ApplicationUsingThreads=1
ConnectionReset=0
ConnectionRetryCount=0
ConnectionRetryDelay=3
Database=mysdb
EnableDescribeParam=1
ExtendedColumnMetadata=0
FailoverGranularity=0
FailoverMode=0
FailoverPreconnect=0
FetchRefCursor=1
FetchTSWTZasTimestamp=0
FetchTWFSasTime=0
HostName=192.168.1.100
InitializationString=
LoadBalanceTimeout=0
LoadBalancing=0
LoginTimeout=15
LogonID=
MaxPoolSize=100
MinPoolSize=0
Password=
Pooling=0
PortNumber=5432  
QueryTimeout=0
ReportCodepageConversionErrors=0
TransactionErrorBehavior=1
XMLDescribeType=-10
于 2011-11-14T16:56:14.810 に答える