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

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 7.2 已于 2007 年 2 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

第 5 章 本地化

摘要

从管理员的角度描述可用的本地化特性。

PostgreSQL通过三种方式支持本地化:

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

  • 使用在PostgreSQL服务器中定义的显式多字节字符集, 来支持所需字符数超出单字节容量的语言, 并提供客户端和服务器之间的字符集重编码。 支持的字符集数量在编译服务器时固定, 而字符串比较等内部操作需要把每个字符扩展为一个 32 位字。

  • 单字节字符重编码为使用多种但仍为单字节字符集的用户 提供了更轻量的解决方案。

5.1. 区域支持 #

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

5.1.1. 概述

区域支持默认并不内置于PostgreSQL;要启用它, 需要给configure脚本提供--enable-locale选项:

$ ./configure --enable-locale

区域支持只影响服务器;所有客户端都与带或不带区域支持的服务器兼容。

若要让消息可以翻译为用户偏好的语言,必须使用 --enable-nls选项。该选项独立于其他区域支持。

关于使用哪些特定文化规则的信息由标准环境变量决定。如果你已经从其他程 序得到了本地化行为,那么你大概已经设置好了这些变量。设置本地化信息最 简单的方式是LANG变量,例如:

export LANG=sv_SE

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

有时混合多个区域设置的规则会很有用,例如使用美国排序规则但使用西班牙语消息。为此,存在一组环境变量,它们为特定类别覆盖LANG的默认值:

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

此外,所有这些特定变量以及LANG变量都可以被LC_ALL环境变量覆盖。

注意

某些消息本地化库还会查看环境变量LANGUAGE,它会覆盖所有 其他用于设置消息语言 的区域设置。如果有疑问,请参考操作系统的文档,尤其是 gettext手册页。

如果希望系统的行为如同没有区域支持一样,可以使用特殊区域C或POSIX,或者干脆取消设置所有与区域相关的变量。

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

LC_COLLATE和LC_CTYPE变量影响索引的排 序顺序。因此,对任何特定的数据库集簇,这些值都必须保持固定,否则文本列 上的索引会损坏。PostgreSQL通过记录 initdb所见的LC_COLLATE和 LC_CTYPE值来强制这一点。服务器启动时会自动采用这两个 值;只有其他LC_类别可以在服务器启动时从环境设置。简而言之, 一个数据库集簇中只能使用一种排序顺序,而且它是在 initdb时选定的。

5.1.2. 优点

区域支持尤其会影响下列特性:

  • ORDER BY查询中的排序顺序。

  • to_char函数族

  • 用于模式匹配的LIKE和~操作符

在PostgreSQL中使用区域支持的唯一严重缺点是速度。因此,只有在确实需要时才使用区域。特别要注意,选择非 C 区域会禁用LIKE和~操作符的索引优化,这可能对使用这些操作符的搜索速度产生巨大影响。

5.1.3. 问题

如果区域设置支持没有像上面说明的那样工作,请检查操作系统中的区域设置支持是否已正确配置。要检查某个给定区域是否已安装并可用,例如可以使用Perl。Perl 也支持区域设置,如果区域损坏,perl -v会给出类似下面这样的抱怨:

$ export LC_CTYPE='not_exist'
$ perl -v
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LC_ALL = (unset),
LC_CTYPE = "not_exist",
LANG = (unset)
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

请检查你的区域文件是否位于正确的位置。可能的位置包括:/usr/lib/locale(Linux、 Solaris)、/usr/share/locale(Linux)、 /usr/lib/nls/loc(DUX 4.0)。如果不确定,请查阅系统的 locale 手册页。

请确认PostgreSQL实际使用的区域设置就是你预期的区域设置。LC_COLLATE和LC_CTYPE设置是在initdb时确定的,不重新运行initdb就无法更改。其他区域设置(包括LC_MESSAGES和LC_MONETARY)由启动 postmaster 的环境决定,通过简单地重启 postmaster 即可更改。你可以使用contrib/pg_controldata实用程序检查数据库的LC_COLLATE和LC_CTYPE设置。

src/test/locale目录包含 PostgreSQL区域设置支持的一个测试套件。

那些通过解析错误消息文本来处理服务器端错误的客户端应用,显然会遇到问 题,因为服务器消息可能使用不同语言。如果你创建这样的应用,就需要制定应 对这种情况的方案。嵌入式 SQL 接口(ecpg)也受此问题影 响。目前建议与ecpg应用交互的服务器配置为以 英语发送消息。

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

提交更正

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