执行CREATE DATABASE或initdb时,PostgreSQL可能返回invalid locale name。这通常表示数据库服务器所在系统或所选Locale提供程序无法识别请求的名称。
Locale由服务器环境决定,不能用客户端电脑上的名称列表替代核对。

Locale名称为什么会无效
PostgreSQL官方文档说明,区域设置支持依赖操作系统提供的Locale;不同操作系统、容器镜像和C库安装的名称可能不同。当前版本还可按版本选择libc、ICU或内置提供程序,其可用名称与语法并不完全相同。
en_US.UTF-8、en_US.utf8或其他拼写不能假定在所有服务器上等价。精简容器经常没有安装完整Locale数据。
先在数据库服务器核对
在PostgreSQL服务器主机执行locale -a查看操作系统可用名称;在数据库中执行SHOW server_version,并查询SELECT datname, datcollate, datctype FROM pg_database了解现有数据库设置。\l+也可显示数据库的区域与提供程序信息。
诊断命令必须在实际运行数据库的主机或容器内执行。托管数据库无法访问系统命令时,应使用平台公布的可用Locale与版本文档。
安装或选择可用Locale
自管Linux可按发行版流程安装或生成所需Locale,再用locale -a确认准确名称。无法增加系统Locale时,应从服务器现有列表中选择符合业务排序、字符分类和合规要求的名称。
不要为了通过创建步骤随意改成C或POSIX。Locale会影响排序、大小写分类和索引行为,变更前应使用代表性数据验证结果。
模板、编码与版本限制
PostgreSQL要求新数据库的编码和Locale与模板兼容。需要使用不同区域设置时,官方CREATE DATABASE文档通常要求以template0为模板,例如CREATE DATABASE appdb TEMPLATE template0 ENCODING 'UTF8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8',其中名称必须以服务器实际列表为准。
不同大版本支持的locale_provider与ICU参数不同。执行前应查看当前服务器版本的CREATE DATABASE文档,不要把新版本语法直接复制到旧实例。
创建后的验收标准
创建后查询pg_database记录实际datcollate与datctype,用包含重音、大小写和多语言字符的测试集验证排序与索引。可在萤光云或LightNode的同版本VPS复制操作系统Locale环境。验收标准是数据库创建成功、编码与模板兼容,排序结果符合业务预期,备份恢复环境也提供同一Locale。
FAQ
问:客户端执行locale -a有参考价值吗?答:只能说明客户端环境,创建数据库使用的是服务器端可用Locale。
问:安装Locale后需要重建已有数据库吗?答:新增Locale不会自动改变已有数据库;要变更数据库区域设置通常需要新建并迁移数据。
问:为什么要用template0?答:它提供原始模板,允许创建与template1不同的编码或区域设置组合,仍须满足服务器规则。
问:C与C.UTF-8相同吗?答:不同系统和提供程序的行为可能不同,不能视为同义名称。
问:升级操作系统后要检查什么?答:应核对Locale与排序规则版本变化,并按PostgreSQL文档评估受影响索引是否需要重建。
温馨提示
温馨提示:把操作系统Locale包、PostgreSQL大版本、提供程序和排序规则纳入恢复文档。灾备节点在接收数据前应确认具备相同区域设置能力。


