在几篇SO帖子中,OP要求以不区分大小写的方式搜索文本列的有效方法。
尽管我能理解,最有效的方法是让数据库具有不区分大小写的排序规则。在我的情况下,我从头开始创建数据库,因此我可以完全控制数据库整理。唯一的问题是我不知道如何定义它,也找不到它的任何例子。
请告诉我如何使用不区分大小写的排序规则创建数据库。
我正在使用postgresql 9.2.4。
编辑1
CITEXT
扩展名是一个很好的解决方案。但是,它有一些限制,如文档中所述。如果不存在更好的方法,我肯定会使用它。
我想强调一点,我希望 ALL 字符串操作不区分大小写。对每个CITEXT
字段使用TEXT
是一种方法。但是,如果可能的话,使用不区分大小写的排序将是最好的。
现在https://stackoverflow.com/users/562459/mike-sherrill-catcall说PostgreSQL使用底层系统公开的任何排序规则。我不介意让操作系统暴露不区分大小写的排序规则。唯一的问题我不知道该怎么做。
答案 0 :(得分:8)
没有不区分大小写的排序规则,但有citext扩展名:
答案 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关键字完成了这项工作。
可以使用关键字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可供选择的任何不区分大小写的排序规则?