Postgresql 中文操作指南

24.1. Locale Support #

Locale 支持是指应用程序尊重有关字母、分类、数字格式化等的文化偏好。PostgreSQL 使用服务器操作系统提供的标准 ISO C 和 POSIX 区域设置工具。有关其他信息,请参阅您的系统的文档。

24.1.1. Overview #

区域设置支持在使用 initdb 创建数据库集群时自动初始化。initdb 将使用其执行环境的区域设置初始化数据库集群,因此,如果您的系统已设置为在您的数据库集群中使用您想要的区域设置,则无需执行其他操作。如果您想使用不同的区域设置(或者您不确定您的系统设置为使用哪个区域设置),则可以向 initdb 指示到底使用哪个区域设置,方法是指定 —​locale 选项。例如:

initdb --locale=sv_SE

Unix 系统的此示例将区域设置设为瑞典语(sv),如瑞典所说的(SE)。其他可能性包括 en_US(美国英语)和 fr_CA(加拿大法语)。如果一个区域设置可以使用多个字符集,则该规范可以采用 language_territory.codeset 形式。例如,fr_BE.UTF-8 表示比利时 (BE) 所说的法语语言 (fr),并使用 UTF-8 字符集编码。

您的系统下以什么名称提供哪些区域设置取决于操作系统供应商提供了什么,以及安装了什么。在大多数 Unix 系统上,命令 locale -a 将提供可用区域设置的列表。Windows 使用更详细的区域设置名称,例如 German_GermanySwedish_Sweden.1252,但原理相同。

有时,混合几个区域设置中的规则是有用的,例如,使用英语排序规则但使用西班牙语信息。为了支持这一点,存在一组区域设置子类别,仅控制本地化规则的某些方面:

类别名称转换为 initdb 选项的名称,以覆盖特定类别的区域设置选择。例如,要将区域设置设为加拿大法语,但对货币格式化使用美国规则,请使用 initdb --locale=fr_CA --lc-monetary=en_US

如果您想让系统表现得好像没有区域设置支持,请使用特殊区域设置名称 C,或等效 POSIX

当创建数据库时,某些语言环境类别必须固定其值。您可以对不同的数据库使用不同的设置,但创建数据库后,您不能再更改该数据库的这些设置。LC_COLLATELC_CTYPE 是这些类别。它们会影响索引的排序顺序,因此必须保持固定状态,否则文本列上的索引就会损坏。(但您可以按照 Section 24.2 中所讨论的内容,使用校对来减轻这种限制。)当运行 initdb 时,将确定这些类别的默认值,并且在创建新数据库时将使用这些值,除非在 CREATE DATABASE 命令中另有规定。

可以随时通过设置与语言环境类别同名的服务器配置参数来更改其他语言环境类别(有关详细信息,请参阅 Section 20.11.2)。实际上,initdb 选择的值只写入配置文件 postgresql.conf 中,以便在启动服务器时用作默认值。如果您从 postgresql.conf 中删除这些赋值,则服务器将从其执行环境继承这些设置。

请注意,服务器的区域设置行为是由服务器看到的环境变量确定的,而不是由任何客户端的环境确定的。因此,在启动服务器前,请务必配置正确的区域设置。这样做的一个结果是,如果客户端和服务器在不同的区域设置中设置,则消息可能会出现不同的语言,具体取决于它们来自何处。

Note

当我们谈到从执行环境继承语言环境时,在大多数操作系统上,这意味着以下内容:对于给定的语言环境类别(例如排序),按此顺序查询以下环境变量,直到找到设置了一个变量为止:LC_ALLLC_COLLATE(或与相应类别对应的变量)、LANG。如果未设置这些环境变量中的任何一个,则语言环境默认为 C

某些消息本地化库还会查看环境变量 LANGUAGE,该变量覆盖所有其他区域设置,以便设置消息的语言。如果您有疑问,请参阅您的操作系统的文档,特别是有关 gettext 的文档。

为了允许将消息翻译成用户首选的语言,必须在构建时选择 NLS(configure --enable-nls)。所有其他区域设置支持将自动内置。

24.1.2. Behavior #

区域设置影响以下 SQL 功能:

在 PostgreSQL 中使用其他区域设置(CPOSIX 除外)的缺点是其对性能的影响。它会减慢字符处理速度,并阻止 LIKE 使用普通索引。出于这个原因,只有在您真正需要区域设置时才使用它们。

为了变通处理 PostgreSQL 在非 C 语言环境下使用带有 LIKE 子句的索引,存在几个自定义操作符类。它们允许创建执行严格的逐字符比较的索引,忽略语言环境比较规则。有关更多信息,请参阅 Section 11.10。另一种方法是按照 Section 24.2 中所讨论的内容,使用 C 校对创建索引。

24.1.3. Selecting Locales #

区域设置可以在不同的范围内选择,具体取决于要求。以上概述显示了如何使用 initdb 指定区域设置,以设置整个集群的默认设置。以下列表显示了可以在其中选择区域设置的位置。每个项目都提供后续项目的默认设置,并且每个较低项目都允许以更精细的粒度覆盖默认设置。

24.1.4. Locale Providers #

PostgreSQL 支持多 locale providers。这指定哪个库提供区域设置数据。一个标准提供程序名称是 libc,该提供程序使用操作系统 C 库提供的区域设置。这些是操作系统提供的的大多数工具使用的区域设置。另一个提供程序是 icu,该提供程序使用外部 ICU 库。只有在构建 PostgreSQL 时配置了对 ICU 的支持时,才能使用 ICU 区域设置。

如上所述,选择区域设置的命令和工具,每个命令和工具都有一个选择区域设置提供程序的选项。前面显示的示例都使用 libc 提供程序,这是默认提供程序。以下是一个使用 ICU 提供程序初始化数据库群集的示例:

initdb --locale-provider=icu --icu-locale=en

有关详细信息,请参见各个命令和程序的说明。请注意,您可以在不同的粒度上混合区域设置提供程序,例如默认情况下为集群使用 libc,但有一个使用 icu 提供程序的数据库,然后在这些数据库中有使用任一提供程序的排序规则对象。

使用哪个区域设置提供程序取决于个人需求。对于大多数简单用途,任一提供程序都可以给出充足的结果。对于 libc 提供程序,则取决于操作系统提供什么;一些操作系统比其他操作系统更好。对于高级用途,ICU 提供了更多的区域设置变体和自定义选项。

24.1.5. ICU Locales #

24.1.5.1. ICU Locale Names #

语言环境名称的 ICU 格式为 Language Tag

CREATE COLLATION mycollation1 (provider = icu, locale = 'ja-JP');
CREATE COLLATION mycollation2 (provider = icu, locale = 'fr');

24.1.5.2. Locale Canonicalization and Validation #

在将 ICU 定义为新的 ICU 排序对象或数据库时,如果区域设置名称不是这种形式,则将该区域设置名称转换为语言标签(“规范化”)。例如:

CREATE COLLATION mycollation3 (provider = icu, locale = 'en-US-u-kn-true');
NOTICE:  using standard form "en-US-u-kn" for locale "en-US-u-kn-true"
CREATE COLLATION mycollation4 (provider = icu, locale = 'de_DE.utf8');
NOTICE:  using standard form "de-DE" for locale "de_DE.utf8"

如果您看到此通知,请确保 providerlocale 是预期结果。若要使用 ICU 提供程序时获得一致的结果,请指定规范 language tag 而不是依赖于转换。

不包含语言名称或使用特殊语言名称 root 的区域设置将被转换为包含语言 und(“未限定”)。

ICU 可以将大多数 libc 区域设置名称以及某些其他格式转换为语言标签,以方便过渡到 ICU。如果在 ICU 中使用了 libc 区域设置名称,则其可能与 libc 中的行为不完全相同。

如果在解释区域设置名称时出现问题,或者如果区域设置名称代表 ICU 无法识别的语言或区域,您将看到以下警告:

CREATE COLLATION nonsense (provider = icu, locale = 'nonsense');
WARNING:  ICU locale "nonsense" has unknown language "nonsense"
HINT:  To disable ICU locale validation, set parameter icu_validation_level to DISABLED.
CREATE COLLATION

icu_validation_level 控制如何报告消息。除非设置为 ERROR,否则仍会创建校对,但行为可能不是用户预期的那样。

24.1.5.3. Language Tag #

语言标签(在 BCP 47 中定义)是一种标准的标识符,用于标识语言、区域和其他有关区域设置的信息。

基本语言标记非常简单,可以是 language-region ;甚至可以简单为 languagelanguage 是语言代码(例如, fr 代表法语),而 region 是地区代码(例如, CA 代表加拿大)。示例: ja-JPdefr-CA

可以将排序设置包含在语言标签中以自定义排序行为。ICU 允许进行广泛自定义,例如,对重音、大小写和标点的敏感性(或不敏感);文本中数字的处理;以及许多其他选项以满足各种用途。

若要将该附加排序规则信息包含在语言标记中,请附加 -u ,表示有其他排序规则设置,后跟一个或多个 -_key-value pairs. The key is the key for a collation setting and value is a valid value for that setting. For boolean settings, the -_key ,可以不指定对应的 -__value ,这意味着 true 的值。

例如,语言标签 en-US-u-kn-ks-level2 表示使用美国区域中的英语语言的区域设置,而排序设置 kn 设置为 trueks 设置为 level2。这些设置表示排序将不区分大小写,并将一系列数字视为一个数字:

CREATE COLLATION mycollation5 (provider = icu, deterministic = false, locale = 'en-US-u-kn-ks-level2');
SELECT 'aB' = 'Ab' COLLATE mycollation5 as result;
 result
--------
 t
(1 row)

SELECT 'N-45' < 'N-123' COLLATE mycollation5 as result;
 result
--------
 t
(1 row)

有关详细内容和使用带自定义校对信息的语言标记的附加示例,请参阅 Section 24.2.3

24.1.6. Problems #

如果区域设置支持无法按上述解释正常工作,请检查您操作系统的区域设置支持是否已正确配置。如果您的操作系统提供了的话,可以使用命令 locale -a 来检查您的系统上安装了哪些区域设置。

检查 PostgreSQL 是否实际使用了您认为它正在使用的区域设置。在创建数据库时确定 LC_COLLATELC_CTYPE 设置,并且无法更改,除非创建一个新数据库。包括 LC_MESSAGESLC_MONETARY 在内的其他区域设置最初由服务器启动时的环境确定,但可以通过即时方式更改。可以使用 SHOW 命令检查活动的区域设置。

源分发中的 src/test/locale 目录包含用于 PostgreSQL 区域设置支持的测试套件。

通过解析错误消息的文本来处理服务器端错误的客户端应用程序在服务器消息采用不同语言时显然会出现问题。建议此类应用程序的作者使用错误代码方案。

维护消息翻译目录需要许多志愿者持续努力,他们希望看到 PostgreSQL 很好地表达其首选语言。如果当前您语言的消息不可用或未完全翻译,我们将感谢您的协助。如果您想要提供帮助,请参阅 Chapter 57 或写信至开发人员邮件列表。