web-dev-qa-db-ja.com

大文字と小文字を区別しない照合でPostgres DBを作成する方法

Windows 7 64ビットでPostgresバージョン9.4.1 64ビットを使用しています。 "casesensitive = OFF"の設定でDBを作成する必要がありますが、これを機能させることができませんでした。 SOや他のフォーラムでもすでに多くの質問を参照しましたが、これらのオプションをすべて試した後でも、私のDBは大文字と小文字を区別し、検索クエリは部分的な結果しか返しません。

誰かがこれをWindows環境で成功させることはできますか?

注:ILIKEオペレーターは知っていますが、データベースストレージはデフォルトでCASE INSENSITIVEでなければならないという明確な要件があるため、アーキテクトチームはそのオプションを検討しません。大文字と小文字を区別した検索が必要になるシナリオはありません。

enter image description here

enter image description here

4
Anup Shah

ウムラウトに関する関連質問への私の最近の回答 here をご覧ください。

基本的に、解決策は適切な名前の「シャドウ」または「検索」列を含みます。基本的に、ON INSERTトリガーを使用して、選択した検索方法に合わせて変更したい検索フィールドを検索列に追加します。この例では、大文字と小文字は区別されません。

私が挙げた例はアイルランドの名前を使用していた

Display_Name    Search_name    Address
------------    -----------    -------
Ronan MacGuire  RONAN MCGUIRE  1 Clontarf D1
Ronan McGuire   RONAN MCGUIRE  2 Malahide D2
Rónán Mcguire   RONAN MCGUIRE  3 Mary's terrace D3

Mc/Macに関する情報は無視して、最後のDisplay_Name "RónánMcguire"に集中してください。Search_Name列では、これはRONAN MCGUIREに変更されています。MCGUIREを検索すると、2人目の "Ronan McGuire"も検出されます。これには、ポータブル/ RDBMSに依存しないという利点があります。多分これはあなたの問題の解決策になるでしょうか?

1
Vérace

これは元のポスターには遅すぎるかもしれませんが、完全にするために、PostgreSQLから大文字と小文字を区別しない動作を実現する方法は、非決定的な照合を設定することです。これはPostgres 12のみです。

詳細は docs here で説明されています。完全を期すために関連部分を再現します。

照合順序は、確定的または非確定的です。確定的照合では確定的比較が使用されます。つまり、同じバイトシーケンスで構成されている場合にのみ文字列が等しいと見なされます。非決定的比較では、文字列が異なるバイトで構成されている場合でも、文字列が等しいと判断される場合があります。典型的な状況には、大文字と小文字を区別しない比較、アクセントを区別しない比較、および異なるUnicode正規形の文字列の比較が含まれます。このような区別されない比較を実際に実装するかどうかは、照合プロバイダー次第です。 deterministicフラグは、バイトごとの比較を使用してタイを分割するかどうかのみを決定します。用語の詳細については、Unicode Technical Standard 10も参照してください。

非決定的照合を作成するには、プロパティdeterministic = falseを指定してCOLLATIONを作成します。次に例を示します。

CREATE COLLATION ndcoll (provider = icu, locale = 'und', deterministic = false);

この例では、標準のUnicode照合を非決定的な方法で使用します。特に、これにより、さまざまな標準形式の文字列を正しく比較できます。より興味深い例では、上記で説明したICUカスタマイズ機能を使用しています。次に例を示します。

CREATE COLLATION case_insensitive (provider = icu, locale = 'und-u-ks-level2', deterministic = false);
CREATE COLLATION ignore_accents (provider = icu, locale = 'und-u-ks-level1-kc-true', deterministic = false);

すべての標準および事前定義の照合は確定的であり、すべてのユーザー定義の照合はデフォルトで確定的です。非決定的照合は、より正確な動作を提供しますが、特にUnicodeの全機能とその多くの特殊なケースを考慮すると、いくつかの欠点があります。何よりも、それらを使用すると、パフォーマンスが低下します。また、パターンマッチング操作など、特定の操作は非決定的照合では不可能です。したがって、特に必要な場合にのみ使用してください。

1