22.1. 区域支持

区域 支持指的是应用中考虑字母、排序、数字格式化等与文化相关的问题。 PostgreSQL 使用服务器操作系统提供的标准 ISO C 和 POSIX 区域机制。 更多的信息请参考你的系统文档。

22.1.1. 概述

区域支持是在使用initdb创建一个数据库集群的时候自动初始化的。 缺省时,initdb 将会按照它的执行环境的区域设置初始化数据库集群; 因此如果你的系统已经设置为你的数据库集群想要的区域,那么你就没有什么可干的。 如果你想使用其它的区域(或者你还不知道你的系统设置的区域是什么),那么你可以用 --locale 命令行选项告诉initdb 比如:

initdb --locale=sv_SE

这个例子是在Unix 系统上 把区域设置为瑞典 (sv) 用瑞典语说话(SE)。 其它的可能性是 en_US (美国英语) and fr_CA (加拿大法语). 如果多于一种字符集用于区域, 那么你可以从language_territory.codeset进行详细设置。 例如: fr_BE.UTF-8 代表 比利时人说的法语, 将编码设置为UTF-8

你的系统里有哪些可用的区域设置,它们的名字是什么, 这些信息都取决于你的操作系统提供商提供了什么以及你安装了什么东西。 在大多数Unix 系统上,命令 locale -a 将提供所有可用区域的一个列表。 Windows 使用冗长的 区域名称, 像 German_Germany 或者Swedish_Sweden.1252,但是基本原则是一样的。

有时候,把几种区域规则混合起来也很有用,比如,使用英语字符规则而用西班牙语信息。为了支持这些,我们有一套区域子范畴用于控制区域规则的某一方面:

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

这些范畴名转换成 initdb 选项的名字以覆盖某个特定范畴的区域选择。比如,要把区域设置为加拿大法语,但使用美国的货币格式化规则,可以使用 initdb --locale=fr_CA --lc-monetary=en_US.

如果你想要你的系统表现得像没有区域支持一样,那么使用特殊的区域 C or POSIX.

一些区域范畴的性质是它们的值必需在数据库集群的生命期内固定。 也就是说,一旦运行了 initdb 之后,你就再也不能更改它们了。 LC_COLLATELC_CTYPE 就是这样的范畴。 它们影响索引的排序顺序,因此它们必需保持固定,否则在文本字段上的索引将会崩溃。

其它区域范畴可以在服务器启动的时候根据需要设置运行时配置变量来改变 (参见 Section 18.10.2 详细信息). initdb 选择的缺省值实际上只是做为服务器启动缺省写入 postgresql.conf配置文件。 如果你在 postgresql.conf 里面删除了这些缺省值,那么服务器将会继承来自运行环境的设置。

请注意服务器的区域行为是由它看到的环境变量决定的, 而不是由客户端的环境变量影响的。因此, 我们要在启动服务器之前认真地设置好这些变量。 这样带来的一种情况是如果客户端和服务器设置成不同的区域, 那么消息可能以不同的语言呈现,实际情况取决于它们的源是什么。

Note: 在我们谈到从执行环境继承区域的时候, 我们的意思是在大多数操作系统上的下列动作: 对于一个给定的区域范畴,比如字符集, 按照下面的顺序评估这些环境变量, 直到找到一个已设置的: LC_ALL, LC_COLLATE (变量对应相应的范畴), LANG. 。 如果这些环境变量一个都没有设置,那么区域缺省为 C.

一些信息区域化库也使用环境变量 LANGUAGE 它覆盖所有其它用于设置语言信息的区域设置。 如果有问题,请参考你的操作系统文档,特别是 gettext的文档获取更多信息。

要允许将信息翻译成用户选择的语言,编译时必需打开 NLS 选项(configure --enable-nls)。所有其它的本地化支持会在编译时自动提供。

22.1.2. 行为

区域设置特别影响下面的 SQL 特性:

PostgreSQL里使用非 C orPOSIX 是速度。它降低了字符处理的速度并阻止了在LIKE 类查询里面普通索引的使用。因此,只有在你实际上需要的时候才使用它。

为了允许 PostgreSQL在非 C 区域下的 LIKE 子句中使用索引,有好几个自定义的操作符类可以用。 这些操作符类允许创建一个严格地比较每个字符的索引,而忽略区域比较规则。 请参考 Section 11.9 获取更多信息。

22.1.3. 问题

如果经过上面解释后区域支持仍然不能运转, 那你就要检查一下操作系统的区域支持是否正确配置。 要检查某个区域是否安装并且正常运转,你可以使用 locale -a 命令(如果你的系统提供了该命令)。

请检查核实PostgreSQL 确实使用了你认为它该用的区域设置。 The LC_COLLATELC_CTYPE 的设置都是在initdb 时决定的,如果不重复 initdb 是不可能改变的。 其它的区域设置包括 LC_MESSAGESLC_MONETARY 都是由服务器的启动环境决定的,但是可以在运行时修改。 你可以用 SHOW 命令检查数据库正在使用的区域设置。

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

那些通过分析错误信息处理服务器端错误的客户端应用很明显会有问题,因为服务器信息可能会以不同的语言表示。我们建议这类应用的开发人员改用错误代码机制。

维护信息翻译表需要许多志愿者的坚持不懈的努力,他们就是希望 PostgreSQL以他们的语言说话的人。如果你的语言信息目前还不可用或者没有完全翻译完成,那么我们很欢迎你的协助。如果你想帮忙,那么请参考Chapter 48或者向开发者邮递列表发邮件。