目录
本章从管理员的角度介绍可用的本地化特性。 PostgreSQL支持两类本地化机制:
利用操作系统的区域设置(locale)特性,提供与区域设置相关的排序顺序、 数字格式、翻译后的消息以及其他方面的支持。详见Section 23.1和Section 23.2。
提供多种字符集,以支持存储各种语言的文本,并提供客户端与服务器之间的 字符集转换。详见Section 23.3。
区域设置支持是指应用程序在字母表、排序、数字格式等 方面尊重文化偏好。PostgreSQL使用服务器操作系统 提供的标准 ISO C 和POSIX区域设置机制。更多信息请参考 系统文档。
在使用initdb创建数据库集簇时,区域设置支持会自动 初始化。默认情况下,initdb会使用其执行环境中的区域 设置来初始化数据库集簇,因此如果你的系统已经设置为数据库集簇想要使用的 区域设置,就无需额外操作。如果想使用不同的区域设置(或者不确定系统当前 设置了哪种区域设置),可以通过指定--locale选项,精确 告诉initdb使用哪种区域设置。例如:
initdb --locale=sv_SE
这个 Unix 系统上的示例把区域设置为在瑞典(SE)使用的 瑞典语(sv)。其他可能的值包括en_US (美国英语)和fr_CA(加拿大法语)。如果一个区域设置 可以使用多于一种字符集,则说明可以采用 language_territory.codeset这样的形式。例如, fr_BE.UTF-8表示在比利时(BE)使用、采用 UTF-8字符集编码的法语(fr)。
系统上有哪些区域设置可用,以及它们以什么名称出现,取决于操作系统供应商 提供了什么以及实际安装了什么。在大多数 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,或等效的POSIX。
某些区域设置类别的值必须在创建数据库时固定下来。你可以为不同数据库使用 不同设置,但数据库一旦创建,这些类别的值就不能再更改。 LC_COLLATE和LC_CTYPE就属于这类 类别。它们会影响索引的排序顺序,因此必须保持固定,否则文本列上的索引会 损坏。(不过,可以通过排序规则缓解这一限制,参见Section 23.2。)这些类别的默认值在运行initdb 时确定,创建新数据库时会使用这些值,除非在CREATE DATABASE 命令中另行指定。
其他区域设置类别可以在任何时候通过设置与其同名的服务器配置参数来更改 (详见Section 19.11.2)。initdb 选择的值实际上只是写入配置文件postgresql.conf中, 作为服务器启动时的默认值。如果从postgresql.conf中 删除这些赋值,服务器就会从其执行环境继承相应设置。
请注意,服务器的区域设置行为由服务器看到的环境变量决定,而不是由任何客 户端的环境决定。因此,务必在启动服务器前配置好正确的区域设置。由此带来 的一个结果是,如果客户端和服务器使用不同的区域设置,消息可能会因其来源 不同而显示为不同语言。
这里所说的从执行环境继承区域设置,在大多数操作系统上是指:对于某个给 定的区域设置类别,例如排序规则,会按以下顺序检查环境变量,直到找到一个 已设置的变量为止:LC_ALL、 LC_COLLATE(或相应类别对应的变量)、LANG。 如果这些环境变量都没有设置,则区域设置默认为C。
某些消息本地化库还会查看环境变量LANGUAGE,它会覆盖所有 其他用于设置消息语言的区域设置。如果有疑问,请参考操作系统文档,尤其是 关于gettext的文档。
若要让消息可以翻译为用户偏好的语言,构建时必须启用NLS (configure --enable-nls)。所有其他区域设置支持都会 自动内置。
区域设置会影响下列 SQL 特性:
在PostgreSQL中使用C或 POSIX之外的区域设置,缺点是会影响性能。它会减慢字 符处理速度,并阻止普通索引用于LIKE。因此,只有在确 有需要时才应使用区域设置。
为了让PostgreSQL在非 C 区域设置下也能对 LIKE子句使用索引,存在若干自定义操作符类可供使用。 它们允许创建执行严格逐字符比较、忽略区域设置比较规则的索引。详见Section 11.10。另一种方法是创建使用C 排序规则的索引,如Section 23.2所述。
如果区域设置支持没有像上面说明的那样工作,请检查操作系统中的区域设置支 持是否已经正确配置。要检查系统中安装了哪些区域设置,可以使用 locale -a命令(如果操作系统提供该命令)。
请确认PostgreSQL实际使用的区域设置就是你预 期的区域设置。LC_COLLATE和LC_CTYPE是在创 建数据库时确定的,除非重新创建数据库,否则不能更改。其他区域设置,包括 LC_MESSAGES和LC_MONETARY,最初由启动服 务器时的环境决定,但可以在运行中动态修改。你可以使用SHOW 命令检查当前生效的区域设置。
源码发布包中的src/test/locale目录包含 PostgreSQL区域设置支持的测试套件。
那些通过解析错误消息文本来处理服务器端错误的客户端应用,显然会遇到问 题,因为服务器消息可能使用不同语言。这类应用的作者应改用错误代码机制。
维护消息翻译目录需要许多志愿者持续投入,他们希望 PostgreSQL能够良好地支持他们偏好的语言。如 果你所用语言的消息目前还不可用,或尚未完全翻译,我们将非常感谢你的协 助。如果你愿意帮忙,请参考Chapter 54,或向开发者邮件列表写 信。