Postgres 区分大小写:Lower() 的含义

Postgres case sensitivity : Implications of Lower()

我已经 运行 解决了 postgres 中区分大小写搜索的问题,并且已经开始通过在每个 WHERE 测试的每一侧使用 LOWER 来处理这个问题。

到目前为止一切顺利。但是,我知道为了使用索引,它们也应该使用 LOWER 创建,这是有道理的。

可是,PK呢?大概这些不会有效,因为似乎不可能在所选 PK 字段上使用函数创建 PK。这不是对 PK 进行的任何过滤或加入的关注吗?

有没有办法解决这个问题?

您仍然可以在 PK 上创建功能索引(即使由许多列组成):

CREATE TABLE test(a text, b text, c text, d text, primary key (a,b,c));
CREATE INDEX ON test (lower(a), lower(b), lower(c));

不过,如果您在数据库中几乎所有地方都遇到这种行为(例如以小写形式存储所有内容),听起来似乎需要进行一些数据改进操作。

这里有一些关于这个主题的想法。

首先,您可以为要求存储的数据为小写的任何列添加约束。那将解决数据库内部的问题。

其次,您可以使用触发器将任何值转换为小写。

第三,可以使用ilike。这可以利用索引进行不区分大小写的搜索。

第四,如果你所有的主键都是合成数字主键,那么你不需要担心区分大小写。