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

mar*_*ark 30 postgresql

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

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

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

我正在使用postgresql 9.2.4.

编辑1

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

我想强调一点,我希望所有字符串操作都不区分大小写.使用CITEXT每一个TEXT字段是一种方式.但是,如果可能的话,使用不区分大小写的校对将是最好的.

现在/sf/users/39372161/说PostgreSQL使用底层系统公开的任何排序规则.我不介意让操作系统暴露不区分大小写的排序规则.唯一的问题我不知道该怎么做.

小智 22

自从这个问题以来发生了很多变化。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;
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅https://www.postgresql.org/docs/current/collat​​ion.html

  • 请注意,从 PostgreSQL v12 开始,非确定性排序规则不支持 LIKE 和 LIKE (5认同)
  • 请注意,这取决于操作系统及其附带的 ICU 版本。 (2认同)
  • “und-u-ks-level2”是什么意思? (2认同)

Den*_*rdy 11

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

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

  • 有关 PostgreSQL v12 及更高版本,请参阅我的其他答案 (/sf/answers/4137109721/)。 (4认同)

Ton*_*ado 7

为了我的目的,ILIKE关键字完成了这项工作.

来自postgres文档:

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

  • 除非你逃避模式,否则如果你试图像`=`那样使用它,那么对于包含`_`或`%`的字符串会产生错误的结果. (2认同)
  • 问题是,像 TypeORM 这样的框架在其查找条件中不支持 ILIKE。 (2认同)