5

PostgreSQL 8.4 を使用して OS X 上の Rails でアプリを開発しています。標準のテキスト クエリで大文字と小文字が区別されないように、アプリのデータベースをセットアップする必要があります。例えば:

SELECT * FROM documents WHERE title = '信じられないほどのドキュメント'

次と同じ結果を返す必要があります。

SELECT * FROM documents WHERE title = '信じられないほどのドキュメント'

明確にするために、私は使いたくない:

(1) where 句またはその他のタイプの特別な比較演算子での LIKE

(2) 列データ型のcitextまたはその他の特別な列インデックス

(3) Sphinx のような全文ソフトウェア

私がしたいのは、大文字と小文字を区別しないテキスト比較をサポートするようにデータベース ロケールを設定することです。私は Mac OS X (10.5 Leopard) を使用しており、既に Encoding を "LATIN1" に設定し、Collat​​ion と Ctype の両方を "en_US.ISO8859-1" に設定しようとしました。これまでのところ成功していません。

どんな助けや提案も大歓迎です。

ありがとう!

アップデート

回答者に敬意を表して、回答の 1 つを正解としてマークしました。ただし、提案されたものとは異なる方法でこの問題を解決することを選択しました。アプリケーションをさらに検討した結果、データベース フィールドに対して大文字と小文字を区別しない比較が必要なインスタンスはごくわずかであるため、大文字と小文字を区別せずに比較する必要があるフィールドに対してシャドウデータベース フィールドを作成します。たとえば、name と name_lower です。私はどこかでこのソリューションに出くわしたと信じています。うまくいけば、PostgreSQL は、SQL Server が将来提供するものと同様の照合オプション (すなわち DOCI) を許可します。

回答してくれたすべての人に感謝します。

4

5 に答える 5

1

設定したすべての制限により、おそらくそれを機能させる唯一の方法は=、テキストに対して独自の演算子を定義することです。破損したインデックスが作成されるなど、他の問題が発生する可能性が非常に高くなります。それ以外は、citext データ型を使用するのが最善の策のようです。それでも、使用しているORMのものでSQLを生成できます。

(独自のロケール定義を作成する可能性については言及していません。それを行っている人を聞いたことがないからです。)

于 2010-01-05T23:02:18.857 に答える
1

列関数を使用してテキストを変換するなどの操作が必要になる可能性があります。たとえば、大文字に変換します。例:

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

これにより、インデックススキャンを使用したパフォーマンスが台無しになる可能性があることに注意してください。ただし、問題が発生した場合は、ターゲット列に列関数を含むインデックスを定義できます。

CREATE INDEX I1 on documents (upper(title))
于 2009-12-18T17:40:47.323 に答える
0
SELECT * FROM documents WHERE title ~* 'incredible document'
于 2010-10-21T09:18:02.147 に答える
0

あなたの問題とあなたの独占は、「泳ぎたいけど、腕を動かしたくない」と言っているようなものです.

あなたは溺れるでしょう。

于 2009-12-18T17:30:15.397 に答える
0

ローカルまたはエンコーディングが使用されるのはそれではないと思います。エンコーディングは、文字セットを選択するためのものであり、文字を処理する方法を決定するためのものではありません。設定があれば構成にあるはずですが、私は見たことがありません。

別のデータベースに移植できないことを恐れて ilike を使用したくない場合は、ActiveRecord を使用している場合に ActiveRecord で使用できる ORM オプションを調べることをお勧めします。

これは、トップのpostgresの人の1人からのものです: http://archives.postgresql.org/pgsql-php/2003-05/msg00045.php

編集: ロケールへの特定の参照を修正しました。

于 2009-12-18T17:35:28.427 に答える