区域支持
区域支持指的是应用遵守文化偏好的问题,包括字母表、排序、数字格式等。PostgreSQL 使用服务器操作系统提供的标准 ISO C 和 POSIX 的区域机制。
区域支持是在使用initdb
创建一个数据库实例时自动被初始化的。默认情况下,initdb
将会按照它的执行环境的区域设置初始化数据库实例;因此如果你的系统已经设置为你的数据库实例想要使用的区域,那么你就没有什么可干的。如果你想使用其它的区域(或者你还不知道你的系统设置的区域是什么),那么你可以用--locale
选项准确地告诉initdb
你要用哪一个区域。比如:
initdb --locale=zh_CN
这个 Unix 系统上的例子把区域设置为中国(CN
)简体中文(zh
)。其他的可能性包括en_US
(美国英语)和fr_CA
(加拿大法语)。如果有多于一种字符集可以用于区域,那么声明可以采用如下的形式:language_territory.codeset
。例如fr_BE.UTF-8
表示在比利时(BE)讲的法语(fr),使用一种UTF-8
字符集编码。
有时候,把几种区域规则混合起来也很有用,比如,使用英语排序规则而用西班牙语消息。为了支持这些,我们有一套区域子类用于控制本地化规则的某些方面:
区域类别 | 描述 |
---|---|
LC_COLLATE |
字符串排序顺序 |
LC_CTYPE |
字符分类(什么是一个字符?它的大写形式是否等效?) |
LC_MESSAGES |
消息使用的语言 |
LC_MONETARY |
货币数量使用的格式 |
LC_NUMERIC |
数字的格式 |
LC_TIME |
日期和时间的格式 |
这些类名转换成initdb
的选项名来覆盖某个特定分类的区域选择。比如,要把区域设置为加拿大法语,但使用 U.S. 规则格式化货币,可以使用initdb --locale=fr_CA --lc-monetary=en_US
。
如果你想让系统表现得象没有区域支持,那么使用特殊的区域名C
或者等效的POSIX
。
一些区域分类的值必需在数据库被创建时的就被固定。你可以为不同的数据库使用不同的设置,但是一旦一个数据库被创建,你就不能在数据库上修改这些区域分类的值。LC_COLLATE
和LC_CTYPE
就是这样的分类。它们影响索引的排序顺序,因此它们必需保持固定,否则在文本列上的索引将会崩溃(但是你可以使用排序规则放松这种限制,讨论见第 23.2 节)。这些分类的默认值在initdb
运行时被确定,并且这些值在新数据库被创建时使用,除非在CREATE DATABASE
命令中特别指定。
其它区域分类可以在任何时候被更改,更改的方式是设置与区域分类同名的服务器配置参数(详见第 19.11.2 节)。被initdb
选中的值实际上只是被写入到配置文件postgresql.conf
中作为服务器启动时的默认值。如果你将这些赋值从postgresql.conf
中除去,那么服务器将会从其执行环境中继承该设置。
请注意服务器的区域行为是由它看到的环境变量决定的,而不是由任何客户端的环境变量影响的。因此,我们要在启动服务器之前认真地设置好这些变量。这样带来的一种后果是如果客户端和服务器设置成不同的区域,那么消息可能以不同的语言呈现,实际情况取决于它们的起源地。
在你的系统上有哪些区域可用取决于操作系统提供商提供了什么以及安装了什么。在大部分 Unix 系统上,您可以通过以下命令列出所有可用的区域。
$ locale -a
可以使用 Windows NLS API 支持的区域名称、语言、国家/地区代码和代码页来设置区域。可选的区域表示形式如下:
-
“区域名称”
-
“语言[_国家区域[.代码页]]”
-
“.代码页”
-
“C”
-
"”
“区域名称” 是简易格式的 IETF 标准化字符串;例如,en-US
表示英语(美国),或zh-CN
表示简体中文(中国)。应该首选这些格式。有关 Windows 操作系统版本支持的区域名称列表,请转到 “[MS-LCID]:Windows 语言代码标识符 (LCID) 参考” 中的附录 A:产品行为,参阅其中表内的“语言标记”列。该资源列出了支持的语言、脚本和区域设置名称的地区部分。有关具有非默认排序顺序的受支持区域设置名称的信息,请参阅排序顺序标识符中的区域名称列。在 Windows 10 或更高版本下,允许使用与有效的 BCP-47 语言标记对应的区域名称。例如,jp-US
是有效的 BCP-47 标记,但它实际上仅适用于US
区域设置功能。
使用语言标记或语言标记和国家区域标记创建区域设置时,“语言[_国家区域[.代码页]]” 格式将用于该类别的区域表示。语言标记中描述了一组受支持的语言字符串,支持的国家区域标记列表在国家/地区字符串中列出。如果指定的语言未与指定的国家或地区关联,则指定国家或地区的默认语言将用于区域的表示。对于嵌入在代码中或持久化到存储设备的区域字符串,我们不建议使用这种表示形式:操作系统更新可能会更改这些字符串,而“区域名称”的表示形式不存在该问题。
“代码页” 是与区域关联的 ANSI/OEM 代码页。通过语言标记或语言标记和国家区域标记指定区域时,代码页已经确定。特殊值.ACP
将指定国家/地区的 ANSI 代码页。特殊值.OCP
将指定国家/地区的 OEM 代码页。例如,如果指定Greek_Greece.ACP
为区域,则区域将设置为Greek_Greece.1253
(希腊语的的 ANSI 代码页),如果指定Greek_Greece.OCP
为区域,则区域将设置为Greek_Greece.737
(希腊语的的 OEM 代码页)。有关代码页的详细信息,请参阅代码页。有关 Windows 支持的代码页的列表,请参阅代码页标识符。
如果仅使用代码页来指定区域设置,则使用用户的默认语言和国家/地区。例如,如果指定.1254
(ANSI 土耳其语)作为系统上为英语(美国)配置的用户区域设置,则区域将设置为English_United States.1254
。不建议使用这种表示形式,因为它可能会导致行为不一致。
区域名C
,指定的是 ANSI C 语言标准的最低符合环境。区域C
假定每个字符数据类型为 1 字节,并且其值始终小于 256。如果区域名是一个空字符串,则区域设置行为是由本机环境具体实现定义的。