Chapter 20. 区域

Table of Contents
20.1. 区域支持
20.1.1. 概述
20.1.2. 行为
20.1.3. 问题
20.2. 字符集支持
20.2.1. 支持字符集编码
20.2.2. 设置字符集
20.2.3. 服务器和客户端之间的自动字符集转换
20.2.4. 进一步阅读

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

20.1. 区域支持

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

20.1.1. 概述

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

initdb --locale=sv_SE

这个例子就把区域设置为瑞典(sv),用瑞典语说话(SE)。 其他的可能性是 en_US(美国英语)和 fr_CA (加拿大法语)。 如果有多于一种字符集可以用于区域,那么声明看起来象下面这样: cs_CZ.ISO8859-2。你的系统里有哪些可用的区域设置,它们的名字是什么, 这些信息都取决于你的操作系统提供商提供了什么以及你安装了什么东西。 (在大多数系统上,命令 locale -a 将提供所有可用的区域的一个列表。)

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

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

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

如果你想要你的系统表现得象没有区域支持,那么使用特殊的区域 CPOSIX

一些区域范畴的性质是它们的值必需在数据库集群的生命期内固定。 也就是说,一旦运行了 initdb,你就再也不能更改它们了。 LC_COLLATELC_CTYPE 就是这样的范畴。它们影响索引的排序顺序,因此它们必需保持固定, 否则在文本字段上的索引将会崩溃。PostgreSQL 通过记录 initdb 看到的 LC_COLLATELC_CTYPE 来强迫这一点。 服务器在启动的时候自动使用这两个数值。

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

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

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

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

要打开信息翻译成用户选择的语言,制作时必需打开 NLS 选项。这个选项独立于其它区域支持。

20.1.2. 行为

区域支持特别影响下面的特性:

  • 使用 ORDER BY 和区域的查询里的排序。

  • The ability to use indexes with LIKE clauses 使用 LIKE 子句的索引的能力

  • 函数里的 to_char家族

  • 模式匹配中的 LIKE~ 操作符

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

20.1.3. 问题

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

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

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

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

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