23.1. 语言环境支持

语言环境支持是指尊重字母,排序,数字格式等文化偏爱的应用程序。PostgreSQL 使用服务器 os 提供的标准 ISO C 和 POSIX 语言环境功能。有关其他信息,请参阅系统的文档。

23.1.1. Overview

使用initdb创建数据库集群时,将自动初始化语言环境支持。 initdb默认情况下将使用其执行环境的语言环境设置来初始化数据库集群,因此,如果您的系统已设置为使用数据库集群中所需的语言环境,则无需执行其他操作。如果要使用其他语言环境(或者不确定系统设置为哪个语言环境),则可以通过指定--locale选项来准确地指示initdb使用哪个语言环境。例如:

initdb --locale=sv_SE

对于 Unix 系统,此示例将区域设置为瑞典语(SE)中的瑞典语(sv)。其他可能性可能包括en_US(美国英语)和fr_CA(加拿大法语)。如果一个语言环境可以使用多个字符集,那么规范可以采用* language_territory.codeset *的形式。例如,fr_BE.UTF-8代表比利时(BE)所说的法语(fr),具有 UTF-8 字符集编码。

系统上以什么名称提供的哪些语言环境取决于 os 供应商提供的内容和安装的内容。在大多数 Unix 系统上,命令locale -a将提供可用语言环境的列表。 Windows 使用更多详细的语言环境名称,例如German_GermanySwedish_Sweden.1252,但是原理是相同的。

有时,混用来自多个语言环境的规则很有用,例如,使用英语排序规则但使用西班牙语消息。为了支持这一点,存在一组只能控制本地化规则某些方面的语言环境子类别:

LC_COLLATE字符串排序 Sequences
LC_CTYPE字符分类(什么是字母?大写字母等效?)
LC_MESSAGES讯息语言
LC_MONETARY货币金额格式
LC_NUMERIC数字格式
LC_TIME日期和时间的格式

类别名称转换为initdb选项的名称,以覆盖特定类别的语言环境选择。例如,要将语言环境设置为加拿大法语,但使用美国规则设置货币格式,请使用initdb --locale=fr_CA --lc-monetary=en_US

如果希望系统表现为不支持语言环境,请使用特殊的语言环境名称C或等效的POSIX

创建数据库时,某些语言环境类别必须固定其值。您可以对不同的数据库使用不同的设置,但是一旦创建了数据库,就无法再为该数据库更改它们。 LC_COLLATELC_CTYPE是这些类别。它们会影响索引的排序 Sequences,因此必须保持固定,否则文本列上的索引会损坏。 (但是您可以使用归类来减轻此限制,如Section 23.2中所述。)这些类别的默认值是在运行initdb时确定的,并且在创建新数据库时将使用这些值,除非在CREATE DATABASE命令中另有指定。

通过设置与语言环境类别名称相同的服务器配置参数,可以随时更改其他语言环境类别(有关详细信息,请参见Section 19.11.2)。实际上,由initdb选择的值仅在启动服务器时写入配置文件postgresql.conf中,用作默认值。如果从postgresql.conf中删除这些分配,则服务器将从其执行环境继承设置。

请注意,服务器的语言环境行为由服务器看到的环境变量确定,而不是由任何 Client 端的环境确定。因此,在启动服务器之前,请小心配置正确的语言环境设置。这样的结果是,如果 Client 端和服务器在不同的语言环境中设置,则邮件可能会以不同的语言显示,具体取决于它们的来源。

Note

当我们谈到从执行环境继承语言环境时,这在大多数 os 上意味着:对于给定的语言环境类别(例如归类),将按以下 Sequences 查询以下环境变量,直到找到一个设置:LC_ALLLC_COLLATE(或对应于相应类别的变量)LANG。如果未设置这些环境变量,则区域设置默认为C

一些消息本地化库还会查看环境变量LANGUAGE,该环境变量会覆盖所有其他区域设置,以设置消息的语言。如有疑问,请参阅您 os 的文档,尤其是有关 gettext 的文档。

为了使消息能够翻译成用户的首选语言,必须在构建时选择configure --enable-nls来选择 NLS。所有其他语言环境支持是自动内置的。

23.1.2. Behavior

语言环境设置会影响以下 SQL 功能:

  • 使用ORDER BY或标准比较运算符对文本数据进行查询时的排序 Sequences

  • upperlowerinitcap函数

  • 模式匹配运算符(LIKESIMILAR TO和 POSIX 样式的正则表达式);语言环境会影响不区分大小写的匹配和字符类正则表达式 的字符分类

  • to_char系列功能

  • 使用带有LIKE子句的索引的能力

在 PostgreSQL 中使用CPOSIX以外的语言环境的缺点是其性能影响。它减慢了字符处理的速度,并防止LIKE使用普通索引。因此,仅在实际需要时才使用语言环境。

作为允许 PostgreSQL 在非 C 语言环境下使用带有LIKE子句的索引的解决方法,存在几个自定义运算符类。这些允许创建执行严格的逐字符比较的索引,而忽略区域设置比较规则。有关更多信息,请参考Section 11.9。另一种方法是使用C归类创建索引,如Section 23.2中所述。

23.1.3. Problems

如果根据上述说明,语言环境支持不起作用,请检查是否正确配置了 os 中的语言环境支持。要检查系统上安装了哪些语言环境,可以在 os 提供的情况下使用命令locale -a

检查 PostgreSQL 实际上是否使用了您认为的语言环境。 LC_COLLATELC_CTYPE设置是在创建数据库时确定的,除非创建新数据库,否则无法更改。其他语言环境设置(包括LC_MESSAGESLC_MONETARY)最初由启动服务器时所处的环境确定,但可以即时更改。您可以使用SHOW命令检查活动的语言环境设置。

源代码发行版中的目录src/test/locale包含一个用于 PostgreSQL 的语言环境支持的测试套件。

当服务器的消息使用其他语言时,通过解析错误消息的文本处理服务器端错误的 Client 端应用程序显然会出现问题。建议此类应用程序的作者改用错误代码方案。

维护消息翻译的目录需要许多希望看到 PostgreSQL 很好地讲其首选语言的志愿者的不断努力。如果您当前使用的语言的消息不可用或未完全翻译,将为您提供帮助。如果您需要帮助,请参考Chapter 54或写到开发人员的邮件列表。