字符串排序顺序(LC_COLLATE和LC_CTYPE)

时间:2011-11-03 09:01:28

标签: postgresql

显然,自版本8.4起,PostgreSQL允许每个数据库使用不同的语言环境 所以我去了文档阅读locales(http://www.postgresql.org/docs/8.4/static/locale.html)。

字符串排序顺序是我特别感兴趣的(我希望字符串排序为'A a b c D d'而不是'A B C ... Z a b c')。

问题1:创建数据库时是否只需要设置LC_COLLATE(字符串排序顺序)?

我还读到了关于LC_CTYPE(字符分类(什么是字母?它的大写字母等价?)

问题2:有人可以解释这意味着什么吗?

3 个答案:

答案 0 :(得分:2)

您描述的排序顺序是大多数区域设置的标准。 试试吧:

SELECT regexp_split_to_table('D d a A c b', ' ') ORDER BY 1;

使用initdb初始化数据库集群时,可以选择--locale=some_locale的语言环境。就我而言,它是--locale=de_AT.UTF-8。如果您未指定任何语言环境继承自环境 - 将使用您当前的系统区域设置。

群集的模板数据库将设置为该区域设置。创建新数据库时,它会从模板继承设置。通常你不必担心任何事情,这一切都正常。

阅读CREATE DATABASE一章了解更多信息。 如果您想加快索引的文本搜索速度,请务必阅读operator classes 版本8.4的所有链接,正如您特别要求的那样。


PostgreSQL 9.1 或更高版本中,有collation support可以更灵活地使用归类:

  

排序规则功能允许指定排序顺序和字符   每列数据的分类行为,甚至是每次操作。   这减轻了LC_COLLATE和LC_CTYPE的限制   数据库的设置在创建后无法更改。

答案 1 :(得分:0)

与其他数据库相比,PostgreSQL在区分大小写方面要严格得多。要在排序时避免这种情况,可以使用字符串函数使其区分大小写:

SELECT * FROM users ORDER BY LOWER(last_name), LOWER(first_name);

如果您有大量数据,每次要显示记录列表时,在整个表格中执行此操作效率会很低。另一种方法是使用citext module,它提供了一种在进行比较时内部不区分大小的类型。

加成:

在搜索时你可能会遇到这个问题,在这里有一个不区分大小写的模式匹配运算符:

SELECT * FROM users WHERE first_name ILIKE "%john%";

答案 2 :(得分:0)

回答问题1(一)

LC_COLLATE 和 LC_CTYPE 设置是在创建数据库时确定的,除非创建新数据库,否则无法更改。