【问题标题】:Force Postgres to install with UTF8 encoding, not LATIN1?强制 Postgres 使用 UTF8 编码安装,而不是 LATIN1?
【发布时间】:2013-12-28 14:03:31
【问题描述】:

我正在尝试在 Vagrant box following the instructions here 上设置 CartoDB。但是,它一直失败,因为它抱怨 Postgres 安装了 Latin-1 编码。

我不知道为什么 Postgres 会这样做,因为我明确地将所有本地设置强制为 UTF8。这是我一直在做的事情:

export LANGUAGE="en_US.UTF-8"
export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
locale
sudo apt-get update
sudo apt-get install -y python-software-properties
sudo add-apt-repository -y ppa:cartodb/gis
sudo add-apt-repository -y ppa:mapnik/v2.1.0
sudo add-apt-repository -y ppa:cartodb/nodejs
sudo add-apt-repository -y ppa:cartodb/redis
sudo add-apt-repository -y ppa:cartodb/postgresql
sudo add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable
sudo apt-get update
sudo apt-get install -y make unp zip libgeos-c1 libgeos-dev gdal-bin libgdal1-dev libjson0
sudo apt-get install python-simplejson libjson0-dev proj-bin proj-data libproj-dev postgresql-9.1

这里是早期locale的输出,说明UTF8设置成功:

LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

运行上述所有命令后,当我检查 Postgres 的状态时,似乎 Postgres 仍然安装了 Latin-1 编码:

sudo -u postgres psql -l

                         List of databases
   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges   
-----------+----------+----------+---------+-------+-----------------------
 postgres  | postgres | LATIN1   | en_US   | en_US | 
 template0 | postgres | LATIN1   | en_US   | en_US | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
 template1 | postgres | LATIN1   | en_US   | en_US | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres

为什么会这样?如何强制 Postgres 使用 UTF8 编码自行安装?

【问题讨论】:

  • 同样,在我的 Vagrantfile 中,我有 sudo update-locale LANG=en_NZ.UTF-8 LC_ALL=en_NZ.UTF-8 将 LANG 和 LC_* 设置为 'en_NZ.UTF-8' 但是当我在此之后安装 postgresql 包时,数据库显示为 LATIN1/en_US跨度>

标签: postgresql encoding vagrant


【解决方案1】:

这可能不是您正在寻找的答案,但您可以使用以下命令将 PostgreSQL 切换到不同的语言环境(备份、重新创建集群和恢复):

sudo -u postgres pg_dumpall > /tmp/postgres.sql
sudo pg_dropcluster --stop 9.1 main
sudo pg_createcluster --locale en_US.UTF-8 --start 9.1 main
sudo -u postgres psql -f /tmp/postgres.sql

如果您想知道为什么安装使用拉丁语,那么您可能需要深入研究安装脚本。但是,如果en_US.UTF-8 不是您的默认系统语言环境,那可能就是问题所在。安装脚本可以加载/etc/default/locale

【讨论】:

  • 效果很好,非常感谢。我只需要在它们前面也运行带有sudo -u postgres 的集群命令。
  • 很好的答案。很高兴知道如何完全避免这种情况并在安装时进行设置
  • 我遇到了同样的问题,默认 pg db 没有遵循 LANG/LANGUAGE/LC_* 环境变量。似乎安装脚本 is 在 /etc/default/locale 之后,因为当我在那里添加这一行 LANG="en_US.UTF-8" 时它起作用了。
  • 我宁愿通过dpkg-reconfigure locales (wiki.debian.org/Locale#Standard) 更改语言环境,而不是手动修改文件。
  • 真诚地感谢您。我被困了很多小时,无法迁移到不同的服务器。这解决了我的问题。
【解决方案2】:

我刚刚在 ubuntu 机器上遇到了同样的问题。

新安装的 postgresql 使用 encoding=SQL_ASCII 和 collat​​e/ctype=C 创建了模板数据库

这里的一个答案让我找到了解决方案:

  • 删除/清除了刚刚安装的 postgresql
  • dpkg-reconfigure locales
    • 为 en_US.UTF-8 安装的语言环境
    • 注销
    • 登录
    • 检查环境变量是否自动设置LANG=en_US.UTF-8
  • 重新安装 postgresql

准备好了,我的数据库现在使用 encoding=UTF8 和 collat​​e/ctype=en_US.UTF-8

【讨论】:

    猜你喜欢
    • 2013-01-09
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    相关资源
    最近更新 更多