Ошибка кодировки символов Rodbc с PostgreSQL - PullRequest
7 голосов
/ 24 августа 2011

Я получаю новую ошибку, которую я никогда раньше не получал при подключении из R к базе данных GreenPlum PostgreSQL с использованием RODBC.Я получил ошибку, используя 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 голосов
/ 24 августа 2011

Во-первых, проблема возникает из-за того, что R пытается преобразовать в локаль Windows, которая поддерживает UTF8.К сожалению, Брайан Рипли неоднократно сообщал, что в Windows нет локалей UTF8.Из часов, потраченных на поиск в Интернете, StackOverflow, Microsoft и т. Д., Я пришел к выводу, что Microsoft ненавидит UTF-8 Windows не будет поддерживать UTF8.

В результате яЯ не уверен, что есть простое решение для этого, если есть какое-либо решение вообще.Лучшее, что я могу порекомендовать, - это обернуть какое-то преобразование на стороне сервера, посмотреть на фильтрацию данных, если это возможно, или попробовать другой язык, если необходимо (например, китайский, японский, корейский).

Есливы решили обернуть конвертер, unicode.org рекомендует этот инструментарий ICU .

3 голосов
/ 24 августа 2011

0xc280 - это элемент управления (U + 0080 в Unicode), который довольно часто вызывает проблемы при использовании SQL и подобных. Проблема часто заключается в цепочке преобразования, которая неизменно происходит, когда вы используете разные приложения, которые используют разные схемы кодирования. В Windows уже включен UTF-8, так что это не проблема Windows. Я полагаю, что проблема возникает до того, как R считывает данные.

Фактически, в цепочке последовательность символов 0x80 в UNICODE будет отображаться в 0xc280 в UTF-8. Предполагается, что это контрольная последовательность, и ее нельзя распечатать. Но велики шансы, что 0x80 на самом деле не UNICODE, а Windows Latin-1 или Latin-2. В этом случае 0x80 представляет знак евро. Это может объяснить, как это заканчивается в ваших данных. Проверьте, можете ли вы найти что-то подобное в данных, это уже кое-что объясняет.

Я предполагаю, что решение будет лежать не на R-конце этой рабочей цепочки, а до этого. Он попытается выполнить автоматическое преобразование, но в некоторых случаях сообщается, что этот сбой (в том числе для SQL и Oracle). Проверьте, в какой кодировке вы работаете в Postgresql, и попробуйте использовать любой из латинских типов. Могут быть и другие ссылки (например, Putty или аналогичный терминал). Я уверен, что все кодировки там ISO8859-1, который является Latin-1. Где-то между ними возникает UTF-8, и когда символ 0x80 неправильно отображается на 0xc280, вы получаете проблемы.

Итак, проверьте кодировки в вашей полной рабочей цепочке и убедитесь, что они все совпадают. Если этого не произойдет, автоматическое преобразование, выполняемое между каждым шагом, может создать проблемы для некоторых символов.

Надеюсь, это поможет.

1 голос
/ 05 октября 2013

Я мог бы опубликовать этот ответ еще здесь, но здесь идет.

Я получаю похожую ошибку при подключении к Postgres DB из клиента MS SQL Management. В моем случае почти невозможно исправить исходные данные.

Мой сценарий:

  1. Попытка подключения к Postgress с использованием связанных объектов MS SQL через ODBC System DSN, и видите ошибки, такие как «ОШИБКА: символ 0xc280 из кодировка "UTF8" не имеет эквивалента в "WIN1252";
  2. Операторы выбора в некоторых таблицах работают, а другие выдают эту ошибку.

Исправлено: Используйте драйвер ODBC, который поддерживает Unicode. Я использую драйвер ODBC от PostgreSQL Global Development Group. Перейдите в раздел «Настройка DSN / Управление DSN» и выберите драйвер Unicode.

Удачи.

0 голосов
/ 14 ноября 2011

По умолчанию Greenplum использует UTF8 для кодировки символов.Вы можете проверить это, войдя на сервер Greenplum и запустив psql - консольный клиент для Greenplum.В этом консольном приложении вы можете выполнить команду: \l, чтобы вывести список всех баз данных, настроенных в Greenplum - это также должно описать набор символов для базы данных.

Я думаю, что ваша проблема в том, что R не поддерживает 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
...