我遇到了postgres中区分大小写的搜索问题,并且已经开始通过在每个WHERE测试的每一侧使用LOWER来解决这个问题。
到目前为止一切顺利。但是,据我所知,为了使用索引,它们也应该使用LOWER创建,这是有道理的。
然而,PK是什么?可能这些都不会有效,因为似乎不可能使用所选PK字段上的函数来创建PK。对于在PK上进行的任何过滤或加入,这不是一个问题吗?
有办法解决这个问题吗?
答案 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));
但是,如果您在数据库中几乎无处不在地遇到这种行为(例如以小写形式存储所有内容),则听起来需要进行一些数据改进操作。