On this page
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_Germany
或Swedish_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_COLLATE
和LC_CTYPE
是这些类别。它们会影响索引的排序 Sequences,因此必须保持固定,否则文本列上的索引会损坏。 (但是您可以使用归类来减轻此限制,如Section 23.2中所述。)这些类别的默认值是在运行initdb
时确定的,并且在创建新数据库时将使用这些值,除非在CREATE DATABASE
命令中另有指定。
通过设置与语言环境类别名称相同的服务器配置参数,可以随时更改其他语言环境类别(有关详细信息,请参见Section 19.11.2)。实际上,由initdb
选择的值仅在启动服务器时写入配置文件postgresql.conf
中,用作默认值。如果从postgresql.conf
中删除这些分配,则服务器将从其执行环境继承设置。
请注意,服务器的语言环境行为由服务器看到的环境变量确定,而不是由任何 Client 端的环境确定。因此,在启动服务器之前,请小心配置正确的语言环境设置。这样的结果是,如果 Client 端和服务器在不同的语言环境中设置,则邮件可能会以不同的语言显示,具体取决于它们的来源。
Note
当我们谈到从执行环境继承语言环境时,这在大多数 os 上意味着:对于给定的语言环境类别(例如归类),将按以下 Sequences 查询以下环境变量,直到找到一个设置:LC_ALL
, LC_COLLATE
(或对应于相应类别的变量)LANG
。如果未设置这些环境变量,则区域设置默认为C
。
一些消息本地化库还会查看环境变量LANGUAGE
,该环境变量会覆盖所有其他区域设置,以设置消息的语言。如有疑问,请参阅您 os 的文档,尤其是有关 gettext 的文档。
为了使消息能够翻译成用户的首选语言,必须在构建时选择configure --enable-nls
来选择 NLS。所有其他语言环境支持是自动内置的。
23.1.2. Behavior
语言环境设置会影响以下 SQL 功能:
在 PostgreSQL 中使用C
或POSIX
以外的语言环境的缺点是其性能影响。它减慢了字符处理的速度,并防止LIKE
使用普通索引。因此,仅在实际需要时才使用语言环境。
作为允许 PostgreSQL 在非 C 语言环境下使用带有LIKE
子句的索引的解决方法,存在几个自定义运算符类。这些允许创建执行严格的逐字符比较的索引,而忽略区域设置比较规则。有关更多信息,请参考Section 11.9。另一种方法是使用C
归类创建索引,如Section 23.2中所述。
23.1.3. Problems
如果根据上述说明,语言环境支持不起作用,请检查是否正确配置了 os 中的语言环境支持。要检查系统上安装了哪些语言环境,可以在 os 提供的情况下使用命令locale -a
。
检查 PostgreSQL 实际上是否使用了您认为的语言环境。 LC_COLLATE
和LC_CTYPE
设置是在创建数据库时确定的,除非创建新数据库,否则无法更改。其他语言环境设置(包括LC_MESSAGES
和LC_MONETARY
)最初由启动服务器时所处的环境确定,但可以即时更改。您可以使用SHOW
命令检查活动的语言环境设置。
源代码发行版中的目录src/test/locale
包含一个用于 PostgreSQL 的语言环境支持的测试套件。
当服务器的消息使用其他语言时,通过解析错误消息的文本处理服务器端错误的 Client 端应用程序显然会出现问题。建议此类应用程序的作者改用错误代码方案。
维护消息翻译的目录需要许多希望看到 PostgreSQL 很好地讲其首选语言的志愿者的不断努力。如果您当前使用的语言的消息不可用或未完全翻译,将为您提供帮助。如果您需要帮助,请参考Chapter 54或写到开发人员的邮件列表。