postgresql里的citext类型

在postgresql数据库中,默认情况下所有字符类型的字段都是区分大小写的,但在实际业务中我们一般需要不区分大小写。这就导致需要不区分大小写的查找,在写sql语句时需要做大小写转换。最为麻烦的是,索引也区分大小写,这使得具有unique属性的字段里会将’abc’、’Abc’、’aBc’视为非重复值,给数据的维护带来麻烦。虽然可以通过使用表达式索引解决,但这显然提高了复杂性。

最优的解决方案是使用citext类型。启用方式如下:
CREATE EXTENSION IF NOT EXISTS;

执行本命令后,会在当前search_path(一般默认是public)所指定的schema的type里新增一个类型,然后在建表时直接指定字段类型为”citext”即可。

这里需要注意的是:如果在其他schema里的表使用了citext类型,必须确保在执行查询前使得search_path指向的是type所在schema。写这篇文章就是因为我的一个数据库,删除了默认的search_path指向的schema(public),创建citext扩展时类型写到了schema(main)中了。由于当前schema(public)不存在,在查询时使得使用了citext类型的字段仍然对大小写敏感,必须手动设置search_path为main之后,再查询才能正常发挥citext类型的大小写不敏感的特性。