Postgres区分大小写:Lower()

时间:2016-08-19 12:00:12

标签: postgresql primary-key case-sensitive

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

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

然而,PK是什么?可能这些都不会有效,因为似乎不可能使用所选PK字段上的函数来创建PK。对于在PK上进行的任何过滤或加入,这不是一个问题吗?

有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

以下是关于这一主题的一些想法。

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

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

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

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

答案 1 :(得分:1)

您仍然可以在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));

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