Rails 3, Heroku: Ошибка сервера Taps: PGError: ОШИБКА: неверная последовательность байтов для кодировки "UTF8": 0xba - PullRequest
1 голос
/ 15 сентября 2011

У меня есть приложение Rails 3.0.9, работающее как локально в моей среде разработчика, так и удаленно в приложении heroku. У меня есть метод, который импортирует файл CSV в модель , и этот файл может содержать неанглийские символы, такие как °, á, é, í и т. Д. (На испанском языке).

В настоящее время я могу импортировать весь файл (75 тыс. Записей) без проблем в моей локальной базе данных dev (SQLite) ; но при загрузке БД в heroku с heroku db:push, происходит сбой с ошибкой, которую я выкладываю в заголовке :

!!! Caught Server Exception

HTTP CODE: 500
Taps Server Error: PGError: ERROR:  invalid byte sequence for encoding "UTF8": 0xba
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".

Очевидно, у Heroku есть проблемы с вставкой символа '°'. (В данный момент в файле нет символов á, é, í и т. Д., Но я подозреваю, что они тоже могут не работать.)

Я установил в своем файле application.rb кодировку по умолчанию следующим образом:

#.../application.rb
config.encoding = "utf-8"

Что еще я могу сделать, чтобы установить «кодировку клиента» и решить эту проблему?

1 Ответ

4 голосов
/ 15 сентября 2011

Числовой знак , º равен 0xBA в ISO-8869-1 , а не в формате UTF-8. Таким образом, ваш CSV-файл кодируется с помощью Latin-1, но вы пытаетесь сохранить его в своей базе данных как UTF-8, не исправляя кодировку.

Вы можете попытаться сообщить своей библиотеке CSV, что она имеет дело с текстом в кодировке Latin-1 и, возможно, позаботится о преобразовании в UTF-8. Если это не сработает, то вы можете сделать это самостоятельно с помощью Iconv :

ruby-1.9.2 > Iconv.iconv('UTF-8', 'ISO-8859-1', "\xba")
 => ["º"]
ruby-1.9.2 > Iconv.iconv('UTF-8', 'ISO-8859-1', "\xb0")
 => ["°"]

У вас нет проблем с SQLite, потому что SQLite имеет тенденцию быть очень щадящим и имеет очень свободную систему типов. PostgreSQL, OTOH, имеет тенденцию быть довольно строгим и правильно жалуется, если вы пытаетесь передать ему неверные данные. Я бы рекомендовал вам прекратить разработку поверх SQLite, если вы собираетесь развертывать в Heroku и PostgreSQL, есть и другие различия, которые могут вызвать проблемы (например, поведение GROUP BY и LIKE).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...