0

我已经使用 MySQL 9 年了,现在有一个新的 Rails 3.2 应用程序,我在其中使用 PostgreSQL。我被我带到项目中的几个假设所困扰。

使用 MySQL,我可以设置数据库设置,以便:

plan = Plan.find_by_name("platinum")

将返回一条记录,即使 db 中的值为Platinum. 使用 PostgreSQL 的默认设置,它不会那样工作。

我相信这一定是一个普遍的问题。我当然不希望我的客户必须输入完全匹配的大小写。由于某种原因,我在网上找不到任何东西,我只是在 PostgreSQL 的网站上找到了 10 年前不支持此功能的支持案例。希望它现在已经改变了。

解决了:

感谢下面的答案,这里是如何做到这一点:

在 Postgres 9.1+ 中,citextcontrib 模块随代码一起提供。您需要做的就是在 psql 命令行中输入:

create extension citext

现在您可以使用 citext 列类型创建表:

create table people (name ctext);

插入一些行进行测试:

insert into people (name) values ('ADRIAN');
insert into people (name) values ('adrian');

并测试:

select * from people where name = 'Adrian';

结果:

  name  
--------
 adrian
 ADRIAN
(2 rows)
4

1 回答 1

1

citext您可以像使用citextcontrib 模块一样定义列。

另一种选择是不使用ilike通配符。如果存在,这仍将使用 b-tree 索引,text_pattern_ops如果不是默认 btree,则至少使用索引。您需要对模式匹配LIKE中记录的表达式元字符进行转义,以防止意外的通配符搜索。

Personally I'm really hoping to see a COLLATE option for case insensitivity added now that per-expression COLLATE is supported... but right now, that's hand-waving future stuff.

于 2013-04-10T23:27:50.777 回答