从管理员的角度描述可用的区域特性.
Postgres 通过三种途径支持区域:
利用操作系统库的区域(locale)特性,提供对集合顺序,数字格式, 和其它方面的支持.
利用明确定义在 Postgres 服务器里的 多字节字符集,支持那些需要多于一个字节容量字符的语言,以及 提供客户端和服务器之间的字符集记录.服务器所支持的字符集数目 是在编译服务器的时候确定的,并且一些象字符串比较这样的内部 操作要求把每个字符扩展为一个 32 位的字.
单字节字符记录为多字节和单字节字符集的用户提供了一种更 轻量级的解决方法.
区域支持指的是应用中考虑字母,排序,数字格式化 等与文化相关的问题. PostgreSQL 使用服务器操作系统提供的标准 ISO C 和类似 POSIX 的区域机制.更多的信息请参考你的系统的文档.
缺省的时候,PostgreSQL 并未内建区域的支持;要 打开它,给 configure 脚本增加 --enable-locale 选项:
$ ./configure --enable-locale
具体使用哪种文化规则的信息由标准环境变量决定. 如果你在其它程序中已经获得了区域的特性,那么很可能你已经 获取了区域的支持.设置区域信息的最简单的方法是设置 LANG 变量,比如:
export LANG=sv_SE这样就把区域设置为瑞典(sv),用瑞典语说话 (SE).其他的可能性是 en_US(美国英语)和 fr_CA (加拿大法语). 如果有多于一种字符集可以用于区域,那么声明看起来象下面这样: cs_CZ.ISO8859-2.你的系统里有哪些可用的区域设置,它们的名字 是什么,这些信息都取决于你的操作系统提供商提供了什么 以及你安装了什么东西.
有时候,把几种区域规则混合起来也很有用,比如,使用美国规则 而用西班牙语信息.要实现这个目的,可以设置一套环境变量,为某一范畴 覆盖缺省 的LANG:
LC_COLLATE | 字符串排序顺序 |
LC_CTYPE | 字符分类(什么是字母?什么是这个字母的等效大写?) |
LC_MESSAGES | 信息的语言 |
LC_MONETARY | 货币金额的格式 |
LC_NUMERIC | 数字的格式 |
LC_TIME | 日期和时间的格式 |
如果你想要你的系统表现得象没有区域支持,那么使用特殊的区域 C 或 POSIX,或者简单地取消掉所有区域 相关变量的设置.
请注意区域行为是由服务器看到的环境变量决定的,而不是由任何客户端 的环境变量设置的.因此,要在启动 postmaster 之前小心地设置好这些变量.
LC_COLLATE 和 LC_CTYPE 变量影响索引的排序顺序. 因此对任意数据库集群,这些值必须固定,否则对文本字段的索引将会 导致数据库崩溃. Postgres 通过记录 initdb 所 看到的 LC_COLLATE 和 LC_CTYPE 值来强制 这样的固定. 服务器在启动的时候自动采纳这两个值;在服务器启动的时候只能设置 其它的 LC_ 范畴.简而言之,在一个数据库集群里只能使用 一个集合顺序,而该顺序是在 initdb 的时候选取的.
区域支持特别影响下面的特性:
ORDER BY 查询里的排序顺序.
函数里的 to_char家族
模式匹配中的 LIKE 和 ~ 操作符
PostgreSQL 里区域支持的唯一的严重缺点是速度.因此 只有你需要的时候才使用它. 同时我们还要特别指出的是选择一个非 C 区域设置将关闭为 LIKE 和 ~ 操作符设置的索引优化, 这样对那些使用这些操作符的搜索可能有巨大的性能影响.
如果经过上面解释后区域支持仍然不能运转,那你就要检查一下看看 你的操作系统的区域支持是否正常. 要检查某个区域是否安装并且正常运转,你可以使用象 Perl 这样的工具.Perl 也支持区域,而且如果区域破损了,perl -v 会发出类似下面的抱怨:
$ export LC_CTYPE='not_exist' $ perl -v perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LC_ALL = (unset), LC_CTYPE = "not_exist", LANG = (unset) are supported and installed on your system. perl: warning: Falling back to the standard locale ("C").
检查你的区域文件是否在正确位置.可能的位置包括: /usr/lib/locale (Linux,Solaris), /usr/share/locale (Linux), /usr/lib/nls/loc (DUX 4.0).如果你 不知道在那里,请检查你的系统的手册页.
目录 src/test/locale 包含 PostgreSQL 的区域支持的测试套件.