Используя кодировку latin1 в приложении rails

Я пытаюсь настроить приложение rails на использование кодировки latin1, используя следующий файл database.yml

development:
adapter: postgresql
database: pana_development
pool: 5
timeout: 5000
encoding: latin1

При беге rake db:create Я получаю следующую ошибку:

Couldn't create database for {"adapter"=>"postgresql", "database"=>"pana_development",    "pool"=>5, "timeout"=>5000, "encoding"=>"latin1"}
PG::Error: ERROR:  encoding LATIN1 does not match locale en_US.UTF-8
DETAIL:  The chosen LC_CTYPE setting requires encoding UTF8.

Что мне нужно сделать, чтобы настроить рельсы с использованием кодировки latin1 в базе данных postgresql?

2 ответа

Решение

Во-первых, вам необходимо указать версии программы.
Далее нужно понимать, что настройка локали по умолчанию LC_CTYPE определяется во время создания кластера. Я цитирую руководство здесь:

Некоторые категории локалей должны иметь фиксированные значения при создании базы данных. Вы можете использовать разные настройки для разных баз данных, но как только база данных будет создана, вы больше не сможете их изменить. LC_COLLATE а также LC_CTYPE эти категории. Они влияют на порядок сортировки индексов, поэтому они должны оставаться фиксированными, иначе индексы в текстовых столбцах будут повреждены. (Но вы можете ослабить это ограничение, используя параметры сортировки, как описано в разделе 22.2.) Значения по умолчанию для этих категорий определяются при запуске initdb, и эти значения используются при создании новых баз данных, если иное не указано в CREATE DATABASE команда.

Вы можете легко решить это с CREATE DATABASE опираясь на template0 база данных шаблонов, в которой нет предопределенных объектов.

CREATE DATABASE pana_development ENCODING 'LATIN1' TEMPLATE template0;

В Ruby вы можете просто указать параметр шаблона:

template: template0

Сравните этот тесно связанный ответ:
rake db: создать ошибку кодирования с помощью postgresql

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

Или вы создаете новый кластер базы данных с соответствующими LC_TYPE и возьми это оттуда.

Есть сценарий, который я нашел в Gist, который работал как шарм

sudo su postgres

psql

update pg_database set datistemplate=false where datname='template1';
drop database Template1;
create database template1 with owner=postgres encoding='UTF-8'
  lc_collate='en_US.utf8' lc_ctype='en_US.utf8' template template0;

update pg_database set datistemplate=true where datname='template1';

Вы можете получить оригинальный источник здесь

Другие вопросы по тегам