显然,自版本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:有人可以解释这意味着什么吗?
答案 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 设置是在创建数据库时确定的,除非创建新数据库,否则无法更改。