2011-08-23 15 views
7

RODBCを使用してRからGreenPlum PostgreSQLデータベースに接続するときに、私が今までに一度も得られなかった新しいエラーが発生しています。 EMACS/ESSとRStudioの両方を使用してエラーが発生しました.RODBC呼び出しは過去と同じように機能しています。PostgreSQLでの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'" 

EDIT: はちょうど別のテーブルを照会しようとした結果を手に入れました。だから、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 
> 
+0

通常のRセッションでは機能しますか?この場合、 'sessionInfo()'からの出力が役に立ちます。 1つまたは両方のシステムのロケール/エンコーディングが変更されたようなものがあるようです。 (ところで、 'odbcConnect()'コールの引数名 'believeNRows'のタイプミスはありません) –

+0

@Gavinいいえ、通常のRセッションからは動作しません。私はsessionInfo()からの出力を追加し、タイプミスを修正しました。ありがとうございました。 – wahalulu

答えて

4

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

結果的に、解決策があれば簡単に解決できるとは思えません。推奨できるのは、サーバー側で何らかのコンバージョンをラップしたり、可能であればデータをフィルタリングしたり、必要に応じて別の言語(たとえば中国語、日本語、韓国語)を試してみることです。

コンバータをラップする場合は、unicode.org recommendsthis ICU toolkitです。

+0

私はなぜデータの中にファンキーな文字が入っているのかわかりません、それはすべて英語で、私が照会しているテーブルはすべて集計です。私はそれを調べます。 – wahalulu

+0

MSのために+1 UTF8を嫌う:) – wahalulu

+0

Shhhh、明示的に言ってはいけない。あなたはそれをgobbledygookに書いてください。そうしないと、私たち全員が困ってしまうでしょう。 ;-) Windows上の私の暗号化アルゴリズムは、すべてをUTF8に変換するだけです。 – Iterator

3

0xc280は、SQLなどの使用時に問題を引き起こす制御要素(U + 0080 Unicode)です。この問題は、さまざまなエンコーディングスキームを使用する異なるアプリケーションを使用するときに必ず発生する変換チェーンにあります。 WindowsにはUTF-8が含まれているため、厳密にはWindowsの問題ではありません。私は、Rがデータを読み込む前に問題が発生していると考えています。

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

私の推測では、ソリューションはこのワークチェーンのR-endにあるのではなく、その前にあると思います。自動変換を試行しますが、SQLとOracleのbtwの場合にも失敗することがあります。どのエンコーディングがPostgreSQLで動作しているのかを確認し、ラテンのタイプを使用しようとします。関連する他のリンクがあるかもしれません(例えば、パテまたは同様の端末)。私は、ISO8859-1、つまりLatin-1がすべてのエンコードにあると確信しています。 UTF-8がどこかに投げ込まれ、0x80文字が0xc280に誤ってマップされると、問題が発生します。

したがって、完全なワークチェーンのエンコーディングを確認し、すべて一致することを確認してください。そうでなければ、各ステップ間で行われる自動変換は、いくつかの文字に問題を引き起こすために縛られます。

これが役に立ちます。

+0

説明をありがとう。私は問題の原因は、テーブル内のフィールドには、奇妙な国際文字を含む可能性のあるURLクエリ文字列が含まれていると思います。しかし、私はPgAdminやRazorSQLのようなODBC経由で他のクライアントを使ってこのテーブルを問い合わせることができました。奇妙な... – wahalulu

0

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

あなたの意見は、Rが文字(UTF8)をサポートしていないことです(別のロケールを使用しています)。 しかし、ODBCドライバではオンザフライ変換を使用できます。すべてのODBCドライバについてはわかりませんが、DataDirectドライバはodbc.iniファイル(通常はユーザのホームディレクトリにあります)の特別なオプションをサポートしています - IANAAppCodePage。

あなたは、このリンク上でこのパラメータに適切なコードを見つけることができる:私はelswhereこの応答を掲示が、ここにいるかもしれない

[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 
1

http://www.iana.org/assignments/character-sets

は、ここでは一例ODのODBC.iniコンテンツです。

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

私のシナリオ:「ERROR:文字 の0xc280をコード 『 ODBCシステムDSN経由でMS SQLリンクオブジェクトを使用してはpostgressに接続し、のようなエラーを確認しようとすると

  1. はUTF8』は同等ではありません「WIN1252」;いくつかのテーブルに
  2. Select文が動作して他の人がこのエラーをスロー

修正:UnicodeをサポートしているODBCドライバを使用して、私は、PostgreSQLグローバル開発GからODBCドライバを使用しています。ルーアップ。 [DSNの設定/ DSNの管理]に移動し、Unicodeドライバを選択します。

幸運。

関連する問題