2011-08-23 9 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'" 

편집 : 그냥 다른 테이블을 쿼리 시도하고 결과를 얻을 수 있었다. 그래서 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()'의 출력이 도움이 될 수 있습니다. 하나 또는 둘 모두의 시스템 로케일/인코딩이 변경되도록 무언가가 변경된 것 같습니다. (그런데,'odbcConnect()'호출에서'believeNRows'라는 인수 이름에 오타가 없습니까?) –

+0

@Gavin 아니요, 정상적인 R 세션에서 작동하지 않습니다. 그냥 시도해 보았습니다. 방금 sessionInfo()에서 출력을 추가하고 오타를 수정했습니다. 덕분에 – wahalulu

답변

4

먼저 R이 UTF8을 지원하는 Windows 로캘로 변환하려고하기 때문에 문제가 발생합니다. 불행히도 Brian Ripley는 Windows에 UTF8 로케일이없는 것으로 여러 번보고했습니다. 웹 검색, StackOverflow, Microsoft 등에서 검색 한 결과 Microsoft 은 UTF-8을 싫어한다는 결론에 도달했습니다. Windows는 UTF8을 지원하지 않습니다.

결과적으로 솔루션이있는 경우 쉽게 해결할 수 있을지 확신 할 수 없습니다. 추천 할 수있는 최선의 방법은 서버 측에서 일종의 변환을 감싸는 것입니다. 가능한 경우 데이터를 필터링하거나 적절한 경우 다른 언어 (예 : 중국어, 일본어, 한국어)를 사용해보십시오.

변환기를 랩핑하기로 결정한 경우 unicode.org recommendsthis ICU toolkit.

+0

. 왜 데이터에 펑키 한 문자가 있는지 모르겠다. 영어로되어 있고 쿼리하는 테이블은 모든 집계이다. 나는 그것을 들여다 볼 것이다. – wahalulu

+0

+1 MS가 UTF8을 싫어합니다. – wahalulu

+0

Shhhh, 명시 적으로 말하지 마십시오. 당신은 gobbledygook에 그것을 써야한다, 그렇지 않으면 우리는 곤경에 처하게 할 것이다. ;-) Windows에서의 암호화 알고리즘은 모든 것을 UTF8로 변환하는 것입니다. 설명해 주신 덕분에 – Iterator

3

0xc280은 SQL 등을 사용할 때 매우 자주 문제를 일으키는 제어 요소 (U + 0080 유니 코드)입니다. 이 문제는 종종 다른 인코딩 스키마를 사용하는 다른 응용 프로그램을 사용할 때 발생하는 변환 체인에 있습니다. Windows는 UTF-8을 현재 포함하고 있으므로 Windows 문제가 아닙니다. R이 데이터를 읽기 전에 문제가 발생한다고 생각합니다.

실제로 체인에서 유니 코드의 문자 시퀀스 0x80은 UTF-8로 0xc280에 매핑됩니다. 이것은 제어 순서로되어 있으며 인쇄 할 수 없습니다. 그러나 실제로 0x80은 UNICODE가 아니라 Windows Latin-1 또는 Latin-2가 될 가능성이 큽니다. 이 경우 0x80은 유로화를 나타냅니다. 그러면 데이터에서 어떻게 끝날지 설명 할 수 있습니다. 데이터에서 이와 비슷한 것을 찾을 수 있는지 확인하십시오. 이미 설명되어 있습니다.

제 생각에 솔루션은이 작업 체인의 R 끝 부분에 놓이지 않고 그 앞에 놓여 있습니다. 자동 변환을 시도하지만이 경우 SQL 및 Oracle btw의 경우에도 실패하는 것으로보고됩니다. PostgreSQL에서 작동중인 인코딩을 확인하고 모든 라틴 유형을 사용하십시오. 다른 링크가 관련 될 수 있습니다 (예 : 퍼티 또는 유사한 터미널). 나는 모든 인코딩이 ISO8859-1 인 라틴어 -1임을 확신합니다. 어딘가에 UTF-8이 중간에 던져지며 0x80 문자가 0xc280에 잘못 매핑되면 문제가 발생합니다.

전체 작업 체인의 인코딩을 확인하고 모두 일치하는지 확인하십시오. 일치하지 않으면 각 단계 사이에 자동 변환이 이루어져 일부 문자에 문제가 생길 수 있습니다.

희망이 도움이됩니다.

+0

. 문제의 원인은 테이블의 필드에 이상한 국제 문자가 포함될 수있는 URL 쿼리 문자열이 포함되어 있다고 생각합니다. 그러나 PgAdmin 및 RazorSQL 같은 ODBC를 통해 다른 클라이언트를 사용하여이 테이블을 쿼리 할 수있었습니다. 기묘한... – wahalulu

0

기본적으로 Greenplum은 문자 인코딩에 UTF8을 사용합니다. Greenplum 서버에 로그인하고 Greenplum에 대한 psql-console 클라이언트를 실행하여 이것을 확인할 수 있습니다. 이 콘솔 응용 프로그램에서 다음 명령을 실행할 수 있습니다 : \l Greenplum에 구성된 모든 데이터베이스를 나열합니다 - 데이터베이스의 문자 집합도 설명해야합니다.

나는 R이 문자 (다른 로케일 사용)에 대해 UTF8을 지원하지 않는다고 생각합니다. 그러나 ODBC 드라이버에서 On-the-Fly 변환을 사용할 수 있습니다.모든 ODBC 드라이버는 모르지만 DataDirect 드라이버는 odbc.ini 파일 (일반적으로 사용자 홈 디렉토리에 있음) - IANAAppCodePage에서 추가 옵션을 지원합니다.

이 링크를이 매개 변수에 적절한 코드를 찾을 수 : 나는 알려서이 응답을 기록하지만, 여기에 간다 수도

[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에 연결할 때 비슷한 오류가 발생합니다. 필자의 경우 소스 데이터를 수정하는 것은 거의 불가능합니다.

내 시나리오 : "오류 : 문자 의 0xc280이 인코딩은" ODBC 시스템 DSN을 통해 MS SQL 링크 된 객체를 사용하여 위해 Postgress에 연결하고 다음과 같은 오류를 볼려고

  1. 가 UTF8은 "동등한에서이 없습니다 "WIN1252"일부 테이블에
  2. Select 문이 작동하고 다른 사람이 오류가 발생

수정 :. 유니 코드를 지원하는 ODBC 드라이버를 사용하여 나는 PostgreSQL의 글로벌 개발 G에서 ODBC 드라이버를 사용하고 있습니다. 지붕. DSN 구성/DSN 관리로 이동하여 유니 코드 드라이버를 선택합니다.

행운을 빈다.

관련 문제