Chapter 5. 区域

Table of Contents
5.1. 区域支持
5.1.1. 概述
5.1.2. 益处
5.1.3. 问题
5.2. 多字节支持
5.2.1. 打开 MB
5.2.2. 设置编码
5.2.3. 前后端之间的自动编码转换
5.2.4. 关于 Unicode
5.2.5. 如果不能转换会怎样?
5.2.6. 参考
5.2.7. 历史
5.2.8. Windows/ODBC 里的 WIN1250
5.3. 单字节字符集记录

从管理员的角度描述可用的区域特性.

Postgres 通过三种途径支持区域:

5.1. 区域支持

区域支持指的是应用中考虑字母,排序,数字格式化 等与文化相关的问题. PostgreSQL 使用服务器操作系统提供的标准 ISO C 和类似 POSIX 的区域机制.更多的信息请参考你的系统的文档.

5.1.1. 概述

缺省的时候,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日期和时间的格式

LC_MESSAGES 只影响那些来自操作系统的信息,不影响来自 PostgreSQL 的.

如果你想要你的系统表现得象没有区域支持,那么使用特殊的区域 CPOSIX,或者简单地取消掉所有区域 相关变量的设置.

请注意区域行为是由服务器看到的环境变量决定的,而不是由任何客户端 的环境变量设置的.因此,要在启动 postmaster 之前小心地设置好这些变量.

LC_COLLATELC_CTYPE 变量影响索引的排序顺序. 因此对任意数据库集群,这些值必须固定,否则对文本字段的索引将会 导致数据库崩溃. Postgres 通过记录 initdb 所 看到的 LC_COLLATELC_CTYPE 值来强制 这样的固定. 服务器在启动的时候自动采纳这两个值;在服务器启动的时候只能设置 其它的 LC_ 范畴.简而言之,在一个数据库集群里只能使用 一个集合顺序,而该顺序是在 initdb 的时候选取的.

5.1.2. 益处

区域支持特别影响下面的特性:

  • ORDER BY 查询里的排序顺序.

  • 函数里的 to_char家族

  • 模式匹配中的 LIKE~ 操作符

PostgreSQL 里区域支持的唯一的严重缺点是速度.因此 只有你需要的时候才使用它. 同时我们还要特别指出的是选择一个非 C 区域设置将关闭为 LIKE~ 操作符设置的索引优化, 这样对那些使用这些操作符的搜索可能有巨大的性能影响.

5.1.3. 问题

如果经过上面解释后区域支持仍然不能运转,那你就要检查一下看看 你的操作系统的区域支持是否正常. 要检查某个区域是否安装并且正常运转,你可以使用象 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 的区域支持的测试套件.