【问题标题】:PG::Error: ERROR: new encoding (UTF8) is incompatiblePG::Error: 错误: 新编码 (UTF8) 不兼容
【发布时间】:2013-05-20 04:02:32
【问题描述】:

我已经从源代码安装了postgresql-9.2.4,现在我执行时在rails应用程序中:

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

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby postgresql


    【解决方案1】:

    至于我,我只是从database.yml改行:

    encoding: unicode

    到:

    encoding: SQL_ASCII

    仅此而已,一切正常。

    【讨论】:

    • 这比公认的解决方案要好,但我是新手,所以我可能不知道将 unicode 更改为 SQL_ASCII 的影响。
    • 使用 SQL_ASCII 不是一个很好的默认值。
    • 这意味着任何非英语语言使用的特殊字符、法语口音,甚至包括摄氏度符号都将无法存储。在这个时代,这不是一个好主意。
    【解决方案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'] %>
    

    我在默认设置中添加了模板:template0

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

    成功了

    【讨论】:

    • 啊,顺序很重要! template: template0 必须出现在 encoding: unicode 之前。
    【解决方案3】:

    好的,以下步骤解决了问题:

    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. 现在切换到模板 1 并 VACUUM FREEZE 模板:

      \c template1

      VACUUM FREEZE;

    问题应该解决了。

    【讨论】:

    • @tokhi 这是可行的解决方案。我对 posgresql 不太熟悉,但我对 debian 或类似操作系统的唯一一小步是 0:sudo -u postgres psql postgres
    【解决方案4】:

    如果您使用 Debian,当您安装 postgresql 软件包时,它将使用您的默认语言环境来创建 template1 数据库。如果您尚未将操作系统配置为使用 UTF-8 作为默认语言环境,则会遇到此错误。

    除上述解决方案外,如果您是全新安装且没有活动数据库,则可以删除 postgresql 包并将默认语言环境设置为 UTF-8。这种方法的优点是以后创建数据库时可以省略语言环境信息。

    dpkg-reconfigure locales

    如果您没有看到所需的语言环境,请安装 locales-all 软件包

    apt-get install locales-all

    然后删除postgresql

    apt-get remove --purge postgresql-&lt;version&gt;

    然后重新安装或更好upgrade to a recent release that isn't in Debian stable

    【讨论】:

    • 我将默认语言环境设置为 en_US.UTF-8 并按照您的说明重新安装 postgres,但之后仍然出现相同的错误。
    • 同意西蒙。真是浪费时间:(
    • 安装语言环境后,它就像魔术一样工作:)
    【解决方案5】:

    如果您的 postgres 安装是新的并且您尚未填充任何数据库,那么您可以删除您的 data 目录并重新运行带有标志的 initdb 命令以使用 UTF-8 创建数据库。

    修改此命令以匹配您的 postgres 安装。 -E 标志告诉什么字符编码应该是默认的。其他字符编码列在here

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

    它应该会出错并告诉您data 目录不为空。按照说明删除目录,然后重新运行命令。 (或者,在开始之前删除 data 目录,但自己看看说明总是很高兴。)

    【讨论】:

      【解决方案6】:

      确保您的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"
      • 这很奇怪......它对development env 的行为是否相同?
      • 谁能解释一下 template0 和 template1 之间的区别以及为什么会这样?
      • @Jake see postgresql.org/docs/10/static/manage-ag-templatedbs.html - 阅读此页面后一切都变得有意义:-)
      猜你喜欢
      • 2013-10-06
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多