5

我正在使用 PostgreSQL 8.4 在 OS X 上的 Rails 中开发一个应用程序。我需要为应用程序设置数据库,以便标准文本查询不区分大小写。例如:

SELECT * FROM files WHERE title = '令人难以置信的文件'

应返回与以下相同的结果:

SELECT * FROM files WHERE title = '令人难以置信的文档'

为了清楚起见,我不想使用:

(1) where 子句中的 LIKE 或任何其他类型的特殊比较运算符

(2) citext 用于列数据类型或任何其他特殊列索引

(3) 任何类型的全文软件,如Sphinx

我想要的是设置数据库区域设置以支持不区分大小写的文本比较。我在 Mac OS X (10.5 Leopard) 上并且已经尝试将编码设置为“LATIN1”,排序规则和 Ctype 都设置为“en_US.ISO8859-1”。至今没有成功。

非常感谢任何帮助或建议。

谢谢!

更新

出于对回答者的尊重,我将给出的答案之一标记为正确答案。但是,我选择以不同于建议的方式解决此问题。在进一步审查应用程序之后,只有少数情况下我需要对数据库字段进行不区分大小写的比较,因此我将为需要不区分大小写比较的那些创建影子数据库字段。例如,name 和 name_lower。我相信我在网上某个地方遇到了这个解决方案。希望 PostgreSQL 将允许与 SQL Server 将来提供的类似的排序选项(即 DOCI)。

特别感谢所有回复的人。

4

5 回答 5

1

您可能需要执行一些操作,例如使用列函数来转换您的文本,例如转换为大写 - 一个示例:

SELECT * FROM documents WHERE upper(title) = upper('incredible document')

请注意,这可能会破坏使用索引扫描的性能,但如果它成为问题,您可以定义一个索引,包括目标列上的列函数,例如

CREATE INDEX I1 on documents (upper(title))
于 2009-12-18T17:40:47.323 回答
1

有了您设置的所有限制,可能使其工作的唯一方法是定义您自己=的文本运算符。它很可能会产生其他问题,例如创建损坏的索引。除此之外,您最好的选择似乎是使用 citext 数据类型;这仍然会让你使用的 ORM 东西生成 SQL。

(我没有提到创建自己的语言环境定义的可能性,因为我从未听说过有人这样做。)

于 2010-01-05T23:02:18.857 回答
0

你的问题和你的独家新闻就像在说“我想游泳,但我不想移动我的手臂。”。

你会淹死尝试。

于 2009-12-18T17:30:15.397 回答
0

我认为这不是本地或编码的用途。编码更多的是用于选择字符集,而不是确定如何处理字符。如果有设置,它将在配置中,但我还没有看到。

如果您因为担心无法移植到另一个数据库而不想使用 ilike,那么我建议您查看 ActiveRecord 可能提供的 ORM 选项(如果您正在使用它)。

这是来自顶级 postgres 的人之一:http: //archives.postgresql.org/pgsql-php/2003-05/msg00045.php

编辑:修复了对语言环境的特定引用。

于 2009-12-18T17:35:28.427 回答
0
SELECT * FROM documents WHERE title ~* 'incredible document'
于 2010-10-21T09:18:02.147 回答