PG :: Error : ERROR : 새 인코딩 (UTF8)이 호환되지 않습니다.


84

postgresql-9.2.4소스에서 설치 했으며 이제 레일스 앱에서 실행할 때 :

rake db:create 내가 얻는 명령 :

$ bin/rake db:create RAILS_ENV="test"
PG::Error: ERROR:  new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII)
HINT:  Use the same encoding as in the template database, or use template0 as template.
: CREATE DATABASE "verticals_test" ENCODING = 'unicode'
/home/vagrant/my-project/.gems/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:652:in `exec
....
bin/rake:16:in `load'
bin/rake:16:in `<main>'
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"unicode", "database"=>"my_db", "host"=>"localhost", "pool"=>5, "username"=>"my_user", "password"=>"my_password"}

어떤 생각?

답변:


229

네, 아래 단계로 문제가 해결되었습니다.

  1. 먼저 template1을 삭제해야합니다. 템플릿은 삭제할 수 없으므로 먼저 일반 데이터베이스가되도록 수정합니다.

    UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';

  2. 이제 드롭 할 수 있습니다.

    DROP DATABASE template1;

  3. 이제 새로운 기본 인코딩을 사용하여 template0에서 데이터베이스를 만들 차례입니다.

    CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE';

  4. 이제 실제로 템플릿이되도록 template1을 수정합니다.

    UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

  5. 이제 template1로 전환하고 템플릿을 VACUUM FREEZE :

    \c template1

    VACUUM FREEZE;

문제가 해결되어야합니다.


1
@tokhi 이것은 작동하는 솔루션입니다. 나는 posgresql에 대해별로 익숙하지 않지만 내 유일한 작은 단계 0 : sudo -u postgres psql postgres데비안 또는 유사한 OS를위한 것입니다.
croonx

41

database.yml파일에 올바른 설정이 있는지 확인하십시오 . template0오류에서 알 수 있듯이을 사용해야 합니다.

test:
  adapter: postgresql
  encoding: unicode
  database: your_db_name
  template: template0
  host: localhost
  ...

template0내 구성에 포함 하지 않았습니다. 배치하면 다음과 같은 결과가 나타납니다.PG::Error: ERROR: permission denied to copy database "template0" : CREATE DATABASE "my_database_test" ENCODING = 'unicode' TEMPLATE = "template0"
tokhi

이상합니다 ... development환경에 대해 동일하게 작동 합니까?
mihai

3
누구든지 template0과 template1의 차이점과 이것이 작동하는 이유를 설명 할 수 있습니까?
제이크

@Jake는 postgresql.org/docs/10/static/manage-ag-templatedbs.html을 참조하십시오 –이 페이지를 읽은 후 모든 것이 의미가 있습니다 :-)
Markus

12

Debian을 사용하는 경우 postgresql 패키지를 설치할 때 기본 로케일을 사용하여 template1 데이터베이스를 생성합니다. 기본 로케일로 UTF-8을 사용하도록 OS를 구성하지 않은 경우이 오류가 발생합니다.

위의 솔루션 외에도 새로 설치 중이고 활성 데이터베이스가없는 경우 postgresql 패키지를 제거하고 기본 로케일을 UTF-8로 설정할 수 있습니다. 이 방법의 장점은 나중에 데이터베이스를 만들 때 로캘 정보를 생략 할 수 있다는 것입니다.

dpkg-reconfigure locales

원하는 로케일이 표시되지 않으면 locales-all 패키지를 설치하십시오.

apt-get install locales-all

그런 다음 postgresql을 제거하십시오.

apt-get remove --purge postgresql-<version>

그런 다음 다시 설치하거나 더 나은 방법 으로 Debian stable이 아닌 최신 릴리스로 업그레이드하십시오 .


2
기본 로케일을 en_US.UTF-8로 설정하고 지시에 따라 postgres를 다시 설치했지만 여전히 동일한 오류가 발생했습니다.
Simon Woodside 2011

Simon과 동의합니다. 시간 낭비 :(
karni

로케일을 설치 한 후 마법처럼 작동했습니다. :)
Daniel Gordi

6

저에 관해서는 다음과 같이 라인을 변경합니다 database.yml.

encoding: unicode

에:

encoding: SQL_ASCII

그것 뿐이고 모든 것이 작동합니다.


2
이것은 허용 된 솔루션보다 낫지 만 저는이 항목에 익숙하지 않아 유니 코드를 SQL_ASCII로 변경하는 영향을 인식하지 못할 수 있습니다.
indieNik

1
SQL_ASCII를 사용하는 것은 좋은 기본값이 아닙니다.
Doug

5

postgres 설치가 새롭고 아직 데이터베이스를 채우지 않은 경우 data디렉토리를 제거 하고 플래그와 함께 initdb 명령을 다시 실행하여 UTF-8을 사용하는 데이터베이스를 만들 수 있습니다.

postgres 설치와 일치하도록이 명령을 수정합니다. -E플래그는 문자 인코딩이 기본이 될해야하는지 알려줍니다. 다른 문자 인코딩은 여기 에 나열되어 있습니다 .

/usr/local/pgsql/bin/initdb -E UTF8 -D /usr/local/pgsql/data -U postgres

오류가 발생하고 data디렉토리가 비어 있지 않다는 메시지가 표시됩니다. 지침에 따라 디렉토리를 제거한 다음 명령을 다시 실행하십시오. (또는 data시작하기 전에 디렉토리를 제거 하지만 항상 지침을 직접 확인하는 것이 좋습니다.)


2

비슷한 문제가있었습니다. 내 database.yml은 다음과 같습니다.

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: chatapp_development

test:
  <<: *default
  database: chatapp_test

production:
  <<: *default
  database: chatapp_production
  username: chatapp
  password: <%= ENV['CHATAPP_DATABASE_PASSWORD'] %>

기본 설정에 template : template0을 추가했습니다.

default: &default
  adapter: postgresql
  template: template0
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

그리고 그것은 일했습니다


아, 순서가 중요합니다! template: template0 보기 전에 와야 encoding: unicode합니다.
Dan Bechard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.