↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
历史版本PostgreSQL 8.0 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

第 20 章 本地化

本章从管理员的角度描述可用的本地化特性。PostgreSQL通过两种途径支持本地化:

  • 使用操作系统的区域特性来提供与区域相关的排序顺序、数字格式、翻译消息以及其他方面。

  • 提供 PostgreSQL服务器中定义的多种字符集(包括多字节字符集),以支持存储各种语言的文本,并提供客户端与服务器之间的字符集转换。

20.1. 区域设置支持 #

区域设置支持是指应用程序在字母表、排序、数字格式等 方面尊重文化偏好。PostgreSQL使用服务器操作系统 提供的标准 ISO C 和POSIX区域设置机制。更多信息请参考 系统文档。

20.1.1. 概述

在使用initdb创建数据库集簇时,区域设置支持会自动 初始化。默认情况下,initdb会使用其执行环境中的区域 设置来初始化数据库集簇,因此如果你的系统已经设置为数据库集簇想要使用的 区域设置,就无需额外操作。如果想使用不同的区域设置(或者不确定系统当前 设置了哪种区域设置),可以通过指定--locale选项,精确 告诉initdb使用哪种区域设置。例如:

initdb --locale=sv_SE

这个例子把区域设置为瑞典(SE)所讲的瑞典语(sv)。其他可能的设置有en_US(美国英语)和fr_CA(加拿大法语)。如果一个区域可以使用多种字符集,那么规范形如cs_CZ.ISO8859-2。系统上有哪些区域设置可用,以及它们以什么名称出现,取决于操作系统供应商 提供了什么以及实际安装了什么。在大多数系统上,命令 locale -a会给出所有可用区域设置的列表。

有时混合多个区域设置的规则会很有用,例如使用英语排序规则但使用西班牙语消息。为此,存在一组只控制本地化规则某些方面的区域设置子类别:

LC_COLLATE 字符串排序顺序
LC_CTYPE 字符分类(什么算字母?它的大写等价形式是什么?)
LC_MESSAGES 消息的语言
LC_MONETARY 货币数量使用的格式
LC_NUMERIC 数字的格式
LC_TIME 日期和时间的格式

这些类别名会转换成initdb选项名,用于覆盖特定类别的区域设置选择。例如,要将区域设置设为加拿大法语,但对货币格式采用美国规则,可以使用initdb --locale=fr_CA --lc-monetary=en_US。

如果希望系统的行为如同没有区域支持一样,可以使用特殊区域C或POSIX。

某些区域类别的性质决定了它们的值必须在数据库集簇的整个生命周期内保持固定。也就是说,一旦initdb运行过,你就再也无法更改它们。LC_COLLATE和LC_CTYPE就属于这类类别。它们影响索引的排序顺序,因此必须保持固定,否则文本列上的索引会损坏。PostgreSQL通过记录initdb所看到的LC_COLLATE和LC_CTYPE值来强制这一点。服务器启动时会自动采用这两个值。

其他区域类别可以在服务器运行期间随时按需更改,方法是设置与区域类别同名的运行时配置变量(细节见第 16.4.8.2 节)。initdb所选择的值实际上只是写入了配置文件postgresql.conf,作为服务器启动时的默认值。如果你从postgresql.conf中删除这些赋值,服务器将从执行环境继承设置。

请注意,服务器的区域设置行为由服务器看到的环境变量决定,而不是由任何客 户端的环境决定。因此,务必在启动服务器前配置好正确的区域设置。由此带来 的一个结果是,如果客户端和服务器使用不同的区域设置,消息可能会因其来源 不同而显示为不同语言。

注意

这里所说的从执行环境继承区域设置,在大多数操作系统上是指:对于某个给 定的区域设置类别,例如排序规则,会按以下顺序检查环境变量,直到找到一个 已设置的变量为止:LC_ALL、 LC_COLLATE(或相应类别对应的变量)、LANG。 如果这些环境变量都没有设置,则区域设置默认为C。

某些消息本地化库还会查看环境变量LANGUAGE,它会覆盖所有 其他用于设置消息的语言的区域设置。如果有疑问,请参考操作系统的文档,特别是 关于gettext的文档,以获取更多信息。

若要让消息可以翻译为用户偏好的语言,构建时必须启用NLS。这一选择与其他区域设置支持无关。

20.1.2. 行为

区域设置支持影响下列特性:

  • 查询中使用ORDER BY时的排序顺序

  • LIKE子句使用索引的能力

  • to_char函数族

在PostgreSQL中使用C或 POSIX之外的区域设置,缺点是会影响性能。它会减慢字 符处理速度,并阻止普通索引用于LIKE。因此,只有在确 有需要时才应使用区域设置。

20.1.3. 问题

如果区域设置支持没有像上面说明的那样工作,请检查操作系统中的区域设置支 持是否已经正确配置。要检查系统中安装了哪些区域设置,可以使用 locale -a命令(如果操作系统提供该命令)。

请确认PostgreSQL实际使用的区域设置就是你预 期的区域设置。LC_COLLATE和LC_CTYPE设置是在 initdb时确定的,不重复执行initdb就无法更改。其他区域设置,包括 LC_MESSAGES和LC_MONETARY,最初由启动服 务器时的环境决定,但可以在运行中动态修改。你可以使用SHOW 命令检查当前生效的区域设置。

源码发布包中的src/test/locale目录包含 PostgreSQL区域设置支持的测试套件。

那些通过解析错误消息文本来处理服务器端错误的客户端应用,显然会遇到问 题,因为服务器消息可能使用不同语言。这类应用的作者应改用错误代码机制。

维护消息翻译目录需要许多志愿者持续投入,他们希望 PostgreSQL能够良好地支持他们偏好的语言。如 果你所用语言的消息目前还不可用,或尚未完全翻译,我们将非常感谢你的协 助。如果你愿意帮忙,请参考第 44 章,或向开发者邮件列表写 信。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。