PG :: Lỗi: ERROR: mã hóa mới (UTF8) không tương thích


84

Tôi đã cài đặt postgresql-9.2.4từ nguồn, bây giờ trong ứng dụng rails khi tôi thực thi:

rake db:create lệnh tôi nhận được:

$ 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"}

bất kỳ ý tưởng?

Câu trả lời:


229

Ok, các bước dưới đây đã giải quyết được sự cố:

  1. Đầu tiên, chúng ta cần bỏ template1. Không thể loại bỏ các mẫu, vì vậy trước tiên chúng tôi sửa đổi nó để nó trở thành một cơ sở dữ liệu bình thường:

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

  2. Bây giờ chúng ta có thể bỏ nó:

    DROP DATABASE template1;

  3. Bây giờ đã đến lúc tạo cơ sở dữ liệu từ template0, với mã hóa mặc định mới:

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

  4. Bây giờ hãy sửa đổi template1 để nó thực sự là một mẫu:

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

  5. Bây giờ, hãy chuyển sang template1 và GIẢI THOÁT VACUUM cho mẫu:

    \c template1

    VACUUM FREEZE;

Vấn đề cần được giải quyết.


1
@tokhi Đây là giải pháp hiệu quả. Tôi không quen lắm với posgresql nhưng bước nhỏ duy nhất của tôi 0: sudo -u postgres psql postgresdành cho debian hoặc hệ điều hành tương tự.
croonx

41

Đảm bảo rằng bạn có thiết lập chính xác trong database.ymltệp của mình . Bạn nên sử dụng template0, vì lỗi gợi ý:

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

Tôi không có template0trong cấu hình của mình, nếu tôi đặt nó, tôi nhận được:PG::Error: ERROR: permission denied to copy database "template0" : CREATE DATABASE "my_database_test" ENCODING = 'unicode' TEMPLATE = "template0"
tokhi

thật lạ ... nó có hành vi giống nhau đối với developmentenv không?
mihai

3
Bất cứ ai có thể giải thích sự khác biệt giữa template0 và template1 và tại sao nó hoạt động?
Jake

@Jake xem postgresql.org/docs/10/static/manage-ag-templatedbs.html - mọi thứ đều có ý nghĩa sau khi đọc trang này :-)
Markus

12

Nếu bạn sử dụng Debian, khi bạn cài đặt gói postgresql, nó sẽ sử dụng ngôn ngữ mặc định của bạn để tạo cơ sở dữ liệu template1. Nếu bạn chưa định cấu hình hệ điều hành của mình để sử dụng UTF-8 làm ngôn ngữ mặc định, bạn sẽ gặp phải lỗi này.

Ngoài các giải pháp trên, nếu bạn đang cài đặt mới và không có cơ sở dữ liệu nào đang hoạt động, bạn có thể xóa gói postgresql và đặt ngôn ngữ mặc định của mình thành UTF-8. Ưu điểm của phương pháp này là bạn có thể bỏ qua thông tin ngôn ngữ khi tạo cơ sở dữ liệu trong tương lai.

dpkg-reconfigure locales

Nếu bạn không thấy ngôn ngữ mong muốn, hãy cài đặt gói tất cả ngôn ngữ

apt-get install locales-all

Sau đó, xóa postgresql

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

Sau đó, cài đặt lại hoặc tốt hơn là nâng cấp lên bản phát hành gần đây không có trong Debian ổn định .


2
Tôi đặt ngôn ngữ mặc định của mình thành en_US.UTF-8 và làm theo hướng dẫn của bạn để cài đặt lại postgres, và sau đó vẫn gặp lỗi tương tự.
Simon Woodside

Đồng ý với Simon. Thật là lãng phí thời gian :(
karni,

Sau khi cài đặt ngôn ngữ, nó hoạt động như một phép thuật :)
Daniel Gordi

6

Đối với tôi, tôi chỉ thay đổi dòng từ database.yml:

encoding: unicode

đến:

encoding: SQL_ASCII

chỉ vậy và tất cả đều hoạt động.


2
Điều này tốt hơn so với giải pháp được chấp nhận nhưng tôi là người mới sử dụng công cụ này nên tôi có thể không biết về ảnh hưởng của việc thay đổi unicode thành SQL_ASCII.
indieNik

1
Sử dụng SQL_ASCII không phải là một mặc định tuyệt vời.
Doug

5

Nếu cài đặt postgres của bạn là mới và bạn chưa điền bất kỳ cơ sở dữ liệu nào, thì bạn có thể xóa datathư mục của mình và chạy lại lệnh initdb với cờ để tạo cơ sở dữ liệu bằng UTF-8.

Sửa đổi lệnh này để phù hợp với cài đặt postgres của bạn. Các -Elá cờ nói gì mã hóa ký tự nên là mặc định. Các bảng mã ký tự khác được liệt kê ở đây .

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

Nó sẽ báo lỗi và cho bạn biết rằng datathư mục không trống. Làm theo hướng dẫn và xóa thư mục, sau đó chạy lại lệnh. (Hoặc, xóa datathư mục trước khi bạn bắt đầu, nhưng thật tuyệt khi xem hướng dẫn cho chính bạn.)


2

Tôi đã có một vấn đề tương tự. Database.yml của tôi như thế này: -

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'] %>

Tôi đã thêm mẫu: template0 vào cài đặt mặc định

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

Va no đa hoạt động


À, thứ tự quan trọng! template: template0 PHẢI đến trước khi encoding: unicodecó vẻ như.
Dan Bechard,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.