文档中心
MogDBMogDB Stack
生态工具
v3.0
文档目录
文档:v3.0
支持的版本:
其他版本:

区域支持

区域支持指的是应用中考虑字母、排序、数值格式化等与文化相关的问题。MogDB使用服务器操作系统提供的标准ISO C 和POSIX区域机制。

概述

区域支持是在使用gs_initdb创建一个数据库集群时自动初始化的。默认情况下,gs_initdb将会按照它的执行环境的区域设置初始化数据库集群; 因此如果系统已经设置为数据库集群想要使用的区域, 那么无需进行任何操作。如果想使用其它的区域(或者不清楚系统当前设置的区域),可以用--locale选项告诉gs_initdb指定一个区域。 比如:

gs_initdb -D /opt/mogdb/data -w "XXXXXXXX" --nodename='data1' --locale=en_US

Unix系统下的这个例子就把区域设置为说瑞典语(sv),并且在瑞典地区(SE)。 其它的可能性是en_US(美国英语)和fr_CA(加拿大法语)等等。 如果有多于一种的字符集可以用于同一个区域,那么声明看起来会像language_territory.codeset。 比如,fr_BE.UTF-8表示为在比利时(BE)地区使用的法语(fr),并且使用UTF-8字符集编码。

系统上有哪些区域可用取决于操作系统提供商。在大部分Unix系统上,命令locale -a将会提供一个所有可用区域的列表。Windows会使用一些更繁琐的区域名,例如German_Germany或者Swedish_Sweden.1252,但是其原则是相同的。

有时,把几种区域规则混合起来也很有用,比如,使用英语排序规则而用西班牙语消息。 为了支持这些,我们有一套区域子类用于控制本地化规则的某些方面:

LC_COLLATE 字符串排序顺序
LC_CTYPE 字符分类(什么是字符?是否区分大小写?)
LC_MESSAGES 消息的语言
LC_MONETARY 货币金额的格式
LC_NUMERIC 数值格式
LC_TIME 日期和时间格式

这些范畴名转换成gs_initdb选项的名字以覆盖某个特定范畴的区域选择。 比如,要把区域设置为加拿大法语,但使用美国的货币格式化规则, 可以使用gs_initdb -D /opt/mogdb/data -w "XXXXXXXX" --nodename='data1' --locale=fr_CA --lc-monetary=en_US

如果想让系统表现得像没有区域支持一样,那么使用特殊的区域名C或者POSIX

一些区域范畴的值必须在创建数据库时固定下来。 可以对不同的数据库使用不同的设置,但一旦创建一个数据库,就再也不能更改了。 LC_COLLATELC_CTYPE就是这样的范畴。 它们影响索引的排序顺序,因此它们必需保持固定,否则在文本字段上的索引将会崩溃。 (但是可以使用排序规则(collation)缓解这种限制, 参见排序规则支持)。 当运行gs_initdb时确定这些范畴的缺省值, 这些值被用于创建新的数据库,除非在CREATE DATABASE命令中明确指定。

其它区域范畴可以在服务器启动的时候根据需要设置服务器配置参数来改变(详见区域和格式化)。 gs_initdb选择的值实际上只是作为服务器启动时的缺省值写入 postgresql.conf配置文件。 如果在postgresql.conf里面删除了这些设置, 那么服务器将会继承来自运行环境的设置。

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

注意:从执行环境继承区域指在大多数操作系统上的下列动作: 对于一个给定的区域分类,比如排序规则,按照下面的顺序评估这些环境变量, 直到找到一个设置过的分类:LC_ALLLC_COLLATE(或者对应于相应分类的变量)、LANG。如果这些环境变量一个都没有被设置,那么将区域缺省设置为C

一些消息本地化库也可以查看环境变量LANGUAGE,它将覆盖所有其它用于设置消息语言的区域设置。如果有疑问, 请参考相关操作系统文档,特别是有关gettext的文档。

行为

区域设置影响下面的 SQL 特性:

  • 查询中使用ORDER BY或者对文本数据的标准比较操作符进行排序
  • upper, lowerinitcap函数
  • 模式匹配运算符(LIKE, SIMILAR TO, 以及POSIX-风格的正则表达式); 区域影响大小写不敏感的匹配和通过字符分类正则表达式的字符分类。
  • to_char函数族
  • 使用LIKE子句的索引能力

MogDB中使用非C或非POSIX区域的缺点是性能影响。它降低了字符处理的速度并且阻止了在LIKE类查询中对普通索引的使用。因此,只能在真正需要的时候才使用它。

为了允许MogDB在非C区域下的LIKE子句中使用索引, 有好几个自定义的操作符类可以用。 这些操作符类允许创建一个严格地比较每个字符的索引, 而忽略区域比较规则。另外一个方法是使用C collation创建索引,参见排序规则支持

问题

如果根据以上区域支持仍然不能运行,检查操作系统的区域支持是否被正确配置。可以使用locale -a命令(如果系统提供了该命令)。

请检查MogDB正在使用正确的区域设置。LC_COLLATELC_CTYPE设置都是在数据库创建时设置的,并且在除了创建数据库之外的操作中都不能被更改。其它的区域设置包括LC_MESSAGESLC_MONETARY都是由服务器启动的环境决定的, 但是可以在运行时修改。可以用SHOW命令检查活跃的区域设置。

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

Copyright © 2009-2022 www.enmotech.com All rights reserved.