PostgreSQL的'initdb'失败了,"invalid locale settings; check LANG and LC_* environment variables"



已经找到了解决方案(见下面的答案(,但我不确定它是否合适;此外,这也可能对其他人有所帮助。


尝试按照文档(18.2 创建数据库集群(设置 PostgreSQL,但在 Ubuntu 18.04(内核:4.15.0-22 通用(上出现以下错误:

$ initdb -D /usr/local/pgsql/data
(...)
initdb: invalid locale settings; check LANG and LC_* environment variables 

在Stackoverflow(1,2(上找到了几个相关的答案,但这些答案并没有解决问题,Serverfault上的一个建议重新启动服务,但PostgreSQL甚至没有运行。

尝试在我在系统上找到的每个变体中显式传递区域设置,但这些变体也失败了,

3617  2018/06/07-08:36 initdb -D ~/Downloads/ --locale=en_US.utf8
3618  2018/06/07-08:36 initdb -D ~/Downloads/ --locale=en_US.UTF8
3621  2018/06/07-08:37 initdb -D ~/Downloads/ --locale=en_US.UTF-8
3622  2018/06/07-08:37 initdb -D ~/Downloads/ --locale="en_US.UTF-8"
3623  2018/06/07-08:37 initdb -D ~/Downloads/ --locale="en_US.utf8"
3645  2018/06/07-09:24 initdb -D ~/Downloads/ --locale="en_US.utf8"

initdb: invalid locale name <the_option_value_above>

有一个关于这个问题的 Arch Linux 论坛讨论,但没有解决方案。


2018/06/07 1214 更新

我在上面链接了答案,但可能不够明确:我确实查看了locale -alocale(没有列出前者的输出,因为我在下面的尝试中安装了所有这些(:

$ locale
LANG=en_US.UTF-8
LANGUAGE=
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

已经尝试过但不起作用(并且每次迭代都重新启动终端(:

  • https://askubuntu.com/questions/454260/how-to-solve-locale-problem

    选择并配置了所有区域设置。

    $ sudo locale-gen en_US.UTF-8
    $ sudo dpkg-reconfigure locales.
    
  • https://github.com/singularityware/singularity/issues/11

    也不

    echo "LC_ALL=en_US.UTF-8" >> /etc/environment
    echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
    echo "LANG=en_US.UTF-8" > /etc/locale.conf
    locale-gen en_US.UTF-8
    

    也不

    sudo apt clean
    sudo apt update
    sudo apt upgrade
    sudo apt-get install -y locales language-pack-fi language-pack-en
    export LANGUAGE=en_US.UTF-8
    export LANG=en_US.UTF-8
    export LC_ALL=en_US.UTF-8
    sudo locale-gen en_US.UTF-8
    sudo dpkg-reconfigure locales
    
  • https://askubuntu.com/questions/162391/how-do-i-fix-my-locale-issue/229512#229512

  • https://askubuntu.com/questions/114759/warning-setlocale-lc-all-cannot-change-locale

    (基本上是上面github链接的变体,无论如何都尝试过。

待办事项: https://unix.stackexchange.com/questions/294845/bash-warning-setlocale-lc-all-cannot-change-locale-en-us-utf-8

从这个线程:

initdb -D <your_data_location> --no-locale --encoding=UTF8

哪里

--locale=LOCALE       set default locale for new databases
--no-locale           equivalent to --locale=C

有一些注意事项(请参阅下面的警告(,但可以使用template0创建全 utf8 数据库(请参阅 21.3。模板数据库(。

从客户端 (psql(:

postgres=# create database test LC_COLLATE "en_US.UTF-8" LC_CTYPE "en_US.UTF-8" template template0;

或通过createdb

createdb --lc-collate="en_US.UTF-8" --lc-ctype="en_US.UTF-8" --template="template0" test2

检查:

$ psql
psql (10.3)
Type "help" for help.
postgres=# l
List of databases
Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
postgres  | postgres | UTF8     | C           | C           | 
template0 | postgres | UTF8     | C           | C           | =c/postgres          +
|          |          |             |             | postgres=CTc/postgres
template1 | postgres | UTF8     | C           | C           | =c/postgres          +
|          |          |             |             | postgres=CTc/postgres
test      | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
test2     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

警告:这可能不是正确的解决方案,上面的解决方法只是解决方法。

请注意使用上述解决方案创建的数据库中下面的"整理"和"Ctype"字段,这可能会导致问题,因为">字符串之间的比较结果取决于LC_CTYPE.在实践中,最明显的效果是排序顺序。(请参阅 DBA StackExchange 线程(。这也在PostgreSQL邮件列表中得到了证实(请参阅有关生产数据库中此问题的线程(。解决此问题的最简单方法可能是重新初始化/重新创建数据库。

postgres=# l
List of databases
Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges   
-----------+----------+----------+---------+-------+-----------------------
postgres  | postgres | UTF8     | C       | C     | 
template0 | postgres | UTF8     | C       | C     | =c/postgres          +
|          |          |         |       | postgres=CTc/postgres
template1 | postgres | UTF8     | C       | C     | =c/postgres          +
|          |          |         |       | postgres=CTc/postgres
(3 rows)

虽然这个问题没有提到尼克斯,但原始海报从尼克斯话语网站链接到这个问题,所以我相信这是一个与尼克斯相关的问题。

我在Nix shell下运行时遇到了这个问题,经过多次搜索后在这里找到了解决方案。 我只需要向我的环境添加glibcLocales。 即要么运行nix-shell -p glibcLocales,要么glibcLocales添加到buildInputs

您可以使用 Linux 中可用的语言环境列表

locale -a

使用其中之一。

例如,您必须选择与您的编码匹配的区域设置

initdb -E UTF8 --locale=en_US.utf8

initdb -E LATIN9 --locale=et_EE.iso885915

据我所知,您可以使用以下语言环境安装其他语言环境

sudo apt-get install language-pack-XX
  1. 检查是否在/etc/locale.gen中启用了区域设置。在我全新安装的 Arch Linux ARM 上,以下行被注释掉了:
    en_US.UTF-8 UTF-8
    
  2. 在没有任何参数的情况下运行locale-gen。它将在生成所有未注释的区域设置时列出它们。
  3. 可选:编辑/etc/locale.conf以设置系统区域设置:
    echo "LANG=en_US.UTF-8" > /etc/locale.conf
    
    重新启动系统以使所有服务都采用新设置。
  4. 运行initdb命令。

对我来说,当我尝试将 postgres 从 9.6 升级到 15 时,这是一个问题。区域设置应替换为本地提供程序ICU 语言环境,例如:

POSTGRES_INITDB_ARGS="--locale=nl_NL --encoding=UTF8" 

->

POSTGRES_INITDB_ARGS="--locale-provider=icu --icu-locale=nl_NL --encoding=UTF8

相关内容

最新更新