2011-11-03 200 views
3

显然PostgreSQL自8.4版以来为每个数据库提供了不同的语言环境 所以我去了文档阅读有关语言环境(http://www.postgresql.org/docs/8.4/static/ locale.html)。 (我想把字符串排序为'A b c D d'而不是'A B C ... Z a b c')。字符串排序顺序(LC_COLLATE和LC_CTYPE)

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

我也读到LC_CTYPE(字符分类(什么是字母其大写当量)?)

问题二:谁能解释这是什么意思?

回答

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,允许更灵活地使用归类:

核对特征允许指定的排序顺序和数据的字符 分类行为per-列,甚至是每个操作。 这可以缓解LC_COLLATE和LC_CTYPE设置创建后无法更改其限制。

-1

与其他数据库相比,PostgreSQL在区分大小写方面更加严格。

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

如果你有大量的数据,这将是低效的跨越整个表每次这样做,你要显示的记录列表:订货时,您可以使用字符串函数,使之区分大小写避免这种情况。另一种方法是使用citext module,它提供了一种在进行比较时内部不区分大小写的类型。

奖励:

搜索过的时候,在这你可以接触到这个问题是有区分大小写的模式匹配操作:

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