【问题标题】:PostgreSQL 10 on Linux - LC_COLLATE locale en_US.utf-8 not validLinux 上的 PostgreSQL 10 - LC_COLLATE 语言环境 en_US.utf-8 无效
【发布时间】:2018-09-21 19:30:59
【问题描述】:

错误:无效的语言环境名称:“en_US.utf-8”

使用 PostgreSQL 10 运行 Ubuntu 服务器 18.04 Beta 2。

在运行适用于 9.5 的数据库创建脚本时,我现在发现将“en_US.UTF-8”作为语言环境存在问题:

CREATE DATABASE db WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';

我知道这可能是多余的,因为我理解默认值为“en_US.etf-8”。删除 LC_COLLATE 和 LC_CTYPE 参数让我可以运行我的脚本。

那么对于 V 10,语言环境定义是否发生了某种变化?还是现在发生了其他事情?我在 Postgres 10 手册中找不到任何相关内容。

【问题讨论】:

  • 请准确的错误。它看起来更像是 ubuntu 问题,但首先 - 分享确切的错误
  • 错误是 ERROR: invalid locale name: "en_US.utf-8"
  • 我已经验证我得到了 LC_COLLATE 和 LC_CTYPE 独立的相同错误(通过单独指定每个)。我注意到 18.04 中的“语言环境”响应表明了 C.UTF-8 的设置。所以也许这是某种类型的冲突?在 SQL 脚本中使用 C.UTF-8 会触发相同的错误 'invalid locale name'。
  • 当我创建数据库(没有语言环境规范)并进入交互式 psql 提示符时,\echo $LC_CTYPE(带有刻度引号)返回一个空白。不确定在没有规范的情况下如何实际处理排序排序规则。
  • 检查可用的语言环境?.. locale -a 如果找不到,请尝试locale-gen en_US.UTF-8

标签: postgresql


【解决方案1】:

我在使用 PostgreSQL 14 的 Ubuntu 服务器 18.04 上遇到此错误,同时尝试运行 Django 项目执行以下操作:

# create new db with the above created user as its owner
createdb -E UTF8 --lc-collate=en_IN.UTF-8 --lc-ctype=en_IN.UTF-8 -T template0 -O <new_user_name> -U <root_user> <new_db_name>

我得到的错误是:

createdb:错误:数据库创建失败:错误:无效的语言环境名称:“en_IN.UTF-8”

我做了以下来解决它:

locale -a 查看缺少“en_IN.UTF-8”的语言环境列表

sudo locale-gen en_IN.UTF-8 生成新的语言环境

对我来说,没有 sudo 就不行。

最后,运行sudo service postgresql restart

【讨论】:

    【解决方案2】:

    在 docker 容器中遇到同样的错误。以下是我如何以非交互方式解决它。

    RUN echo "en_US UTF-8 " >> /etc/locale.gen && locale-gen
    

    【讨论】:

      【解决方案3】:

      已经在 kubuntu 上执行过,运行良好,加上前面提到的一些额外步骤,正确的步骤应该是:

      1. 验证存在;如果它不存在,则继续创建它(需要 sudo 权限)

        locale -a  |grep -i 'es_ES.utf-8'
        sudo locale-gen es_PE.UTF-8
        
      2. 验证是否创建了语言环境。

        locale -a|grep -i es
        es_ES.utf8
        es_PE.utf8
        
      3. 创建语言环境后,请重新启动 postgres 服务,否则您将收到以下错误:

        ERROR:  invalid locale name: "es_ES.UTF-8"
        
      4. 重启postgres服务

        systemctl restart postgresql
        
      5. 终于创建了数据库。

        postgres=# create database db_izipay_prod with template=template0 encoding='utf8' lc_collate='es_ES.UTF-8' lc_ctype='es_ES.UTF-8' owner=postgres;
        CREATE DATABASE
        

      【讨论】:

        【解决方案4】:

        我遇到了同样的错误,我生成了新的语言环境:

        locale-gen en_US.UTF-8 
        

        我通过locale -a 验证它确实存在,然后我注销以确认,但在创建数据库时仍然遇到同样的错误。

        最后,我通过简单地重启 postgresql 服务器解决了这个错误:

        sudo systemctl restart postgresql
        

        之后,数据库创建命令就开始工作了!

        【讨论】:

          【解决方案5】:

          使用locale -a 检查可用的语言环境,如果找不到,请尝试手动添加:

          locale-gen en_US.UTF-8 
          

          之后

          CREATE DATABASE db WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';
          

          应该工作

          【讨论】:

          • 在运行脚本的输出后,我发现它并没有真正按预期工作。添加 en_US.UTF-8 后,locale -A 将其报告为 en_US.UTF8(不带 -)。我必须相应地更新 SQL 脚本。
          • 错误:无效的区域名称:“en_US.UTF-8”
          • 我发现需要重启 (sudo service postgresql restart) 才能工作。
          猜你喜欢
          • 2011-05-18
          • 2017-11-15
          • 2021-04-07
          • 2018-09-21
          • 2017-06-21
          • 2019-09-04
          • 2019-07-31
          • 2021-06-20
          相关资源
          最近更新 更多