本章从管理员的角度描述可用的区域特性。 PostgreSQL 通过三种途径支持区域:
利用操作系统库的区域(locale)特性,提供对集合顺序,数字格式, 翻译过的信息,和其它方面的支持。
提供一些定义在 PostgreSQL 服务器里的不同的节字符集, 包括多字节字符集,以支持多种类型的语言的排序文本, 以及提供客户端和服务器端之间的字符集记录。
单字节字符记录为多字节和单字节字符集的用户提供了一种更轻量级的解决方法。
区域支持指的是应用中考虑字母,排序,数字格式化等与文化相关的问题。 PostgreSQL 使用服务器操作系统提供的标准 ISO C 和POSIX的区域机制。 更多的信息请参考你的系统的文档。
区域支持是在使用 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 | 日期和时间的格式 |
如果你想要你的系统表现得象没有区域支持,那么使用特殊的区域 C 或 POSIX。
一些区域范畴的性质是它们的值必需在数据库集群的生命期内固定。 也就是说,一旦运行了 initdb,你就再也不能更改它们了。 LC_COLLATE 和 LC_CTYPE 就是这样的范畴。它们影响索引的排序顺序,因此它们必需保持固定, 否则在文本字段上的索引将会崩溃。PostgreSQL 通过记录 initdb 看到的 LC_COLLATE 和 LC_CTYPE 来强迫这一点。 服务器在启动的时候自动使用这两个数值。
其它区域范畴可以在服务器启动的时候根据需要设置运行时配置变量来改变(参阅 Section 17.10.2 获取细节)。 initdb 选择的缺省值实际上只是做为服务器运行缺省写入配置文件 postgresql.conf。 如果你在 postgresql.conf 里面删除了这些的赋值,那么服务器将会继承来自运行环境的设置。
请注意服务器的区域行为是由它看到的环境变量决定的,而不是由任何客户端的环境变量影响的。 因此,我们要在启动服务器之前认真地设置好这些变量。 这样带来的一种情况是如果客户端和服务器设置成不同的区域, 那么消息可能以不同的语言呈现,实际情况取决于它们的源是什么。
注意: 在我们谈到从执行环境继承区域的时候,我们的意思是在大多数操作系统上的下列动作: 对于一个给定的区域范畴,比如字符集,按照下面的顺序评估这些环境变量, 直到找到一个设置了的:LC_ALL, LC_COLLATE(变量对应相应的范畴), LANG。如果这些环境变量一个都没有设置,那么区域缺省为 C。
一些信息区域化库也使用环境变量 LANGUAGE, 它覆盖所有其它用于设置语言信息的区域设置。如果有问题, 请参考你的操作系统的文档,特别是 gettext 的文档获取更多信息。
要打开信息翻译成用户选择的语言,制作时必需打开 NLS 选项。这个选项独立于其它区域支持。
区域设置特别影响下面的 SQL 特性:
模式匹配中的 LIKE 和 ~ 操作符
PostgreSQL 里使用非 C 或 POSIX 区域的缺点是速度。 它降低了字符处理的速度和阻止了在 LIKE 类查询里面普通索引的使用。 因此,只有在你实际上需要的时候才使用它。
为了允许 PostgreSQL 在非 C 区域下的 LIKE 子句中使用索引, 有好几个客户化的操作符表可以用。这些操作符表允许创建一个严格地比较每个字符地索引, 而忽略区域比较规则。请参考 Section 11.8 获取更多信息。
如果经过上面解释后区域支持仍然不能运转,那你就要检查一下看看你的操作系统的区域支持是否正确配置。 要检查某个区域是否安装并且正常运转,你可以使用象命令 locale -a。 (如果你的系统提供了该命令)。
请检查核实 PostgreSQL 确实使用了你认为它该用的区域设置。 LC_COLLATE 和 LC_CTYPE 设置都是在 initdb 的时候决定的,如果不重复 initdb 是不可能改变的。其它的区域设置包括 LC_MESSAGES 和 LC_MONETARY 都是由服务器启动的环境决定的, 但是可以在运行时修改。你可以用 SHOW 命令检查数据库活跃的区域设置。
目录 src/test/locale 包含 PostgreSQL 的区域支持的测试套件。
那些通过分析错误信息处理服务器端错误的客户端应用很明显会有问题,因为服务器来的信息可能会是以不同语言表示的。 我们建议这类应用的开发人员改用错误代码机制。
维护信息翻译表需要许多志愿者的坚持不懈的努力, 他们就是希望 PostgreSQL 以它们的语言说话的人。 如果你的语言的信息目前还不可用或者没有完全翻译完成, 那么我们很欢迎你的协助。如果你想帮忙,那么请参考 Chapter 45 或者向开发者邮递列表发邮件。