如何使我的postgresql数据库使用不区分大小写的排序规则?

时间:2013-09-14 23:07:41

标签: postgresql

在几篇SO帖子中,OP要求以不区分大小写的方式搜索文本列的有效方法。

尽管我能理解,最有效的方法是让数据库具有不区分大小写的排序规则。在我的情况下,我从头开始创建数据库,因此我可以完全控制数据库整理。唯一的问题是我不知道如何定义它,也找不到它的任何例子。

请告诉我如何使用不区分大小写的排序规则创建数据库。

我正在使用postgresql 9.2.4。

编辑1

CITEXT扩展名是一个很好的解决方案。但是,它有一些限制,如文档中所述。如果不存在更好的方法,我肯定会使用它。

我想强调一点,我希望 ALL 字符串操作不区分大小写。对每个CITEXT字段使用TEXT是一种方法。但是,如果可能的话,使用不区分大小写的排序将是最好的。

现在https://stackoverflow.com/users/562459/mike-sherrill-catcall说PostgreSQL使用底层系统公开的任何排序规则。我不介意让操作系统暴露不区分大小写的排序规则。唯一的问题我不知道该怎么做。

5 个答案:

答案 0 :(得分:8)

没有不区分大小写的排序规则,但有citext扩展名:

http://www.postgresql.org/docs/current/static/citext.html

答案 1 :(得分:7)

此问题以来发生了很多变化。 PostgreSQL v12中增加了对不区分大小写排序规则的本机支持。如其他答案所述,这基本上不赞成使用citext扩展名。

在PostgreSQL v12中,可以做到:

    CREATE COLLATION case_insensitive (
      provider = icu,
      locale = 'und-u-ks-level2',
      deterministic = false
    );

    CREATE TABLE names(
      first_name text,
      last_name text
    );

    insert into names values
      ('Anton','Egger'),
      ('Berta','egger'),
      ('Conrad','Egger');

    select * from names
      order by
        last_name collate case_insensitive,
        first_name collate case_insensitive;

有关更多信息,请参见https://www.postgresql.org/docs/current/collation.html

答案 2 :(得分:5)

出于我的目的,ILIKE关键字完成了这项工作。

来自postgres docs

  

可以使用关键字ILIKE而不是LIKE来进行匹配   根据活动区域设置不区分大小写。这不在   SQL标准,但是PostgreSQL扩展。

答案 3 :(得分:1)

这并没有改变整理,但也许有人帮助这种类型的查询,我使用函数lower

SELECT id, full_name, email FROM nurses WHERE(lower(full_name) LIKE '%bar%' OR lower(email) LIKE '%bar%')

答案 4 :(得分:-1)

我认为在创建数据库集群时,需要将排序规则指定为initdb的命令行选项。像

这样的东西
initdb --lc-collate=en_US.UTF-8 

似乎在Ubuntu和Mac OS X上使用PostgreSQL 9.3,initdb使用不区分大小写的排序规则自动创建数据库集群,该排序规则在当前操作系统区域设置中是默认的,在我的情况下,{{1} }。

您是否可以使用不默认为主机区域设置的旧版PostgreSQL?或者可能是你在操作系统上没有提供PostgreSQL可供选择的任何不区分大小写的排序规则?