PostgreSQL データベース全体、またはサーバー / クラスター全体で大文字と小文字を区別しないように設定するにはどうすればよいですか?
UPD: 列の値の場合。MS SQL からデータベースを移行したばかりで、以前と同様の動作をソート、フィルタリング、その他の操作で最も簡単な方法で取得する方法を探しています。
PostgreSQL データベース全体、またはサーバー / クラスター全体で大文字と小文字を区別しないように設定するにはどうすればよいですか?
UPD: 列の値の場合。MS SQL からデータベースを移行したばかりで、以前と同様の動作をソート、フィルタリング、その他の操作で最も簡単な方法で取得する方法を探しています。
引用符で囲まれていない識別子は、デフォルトで (および SQL 標準に従って) 大文字と小文字を区別しません。
それ以外は、標準のPostgresで「大文字と小文字を区別しない」を設定できません。
CITEXTは間違いなく最も痛みの少ないルートです(@Matthew Woodからの提案による)
次のコマンドを使用して、拡張機能を現在のデータベースにインストールします。
CREATE EXTENSION IF NOT EXISTS citext;
これは、次のようなクエリを実行するときにうまく機能します。
SELECT * FROM product WHERE serial_number = 'aB'
ab
、Ab
、aB
またはに正常に一致しAB
ます。
問題が発生する可能性があるのは、パラメーター化された SQL を使用していて、プロバイダーにコマンドを作成させている場合です。たとえば、次のコマンドで Npgsql (.NET 用の ADO.NET プロバイダー) を使用します。
SELECT * FROM product WHERE serial_number = @serial_number;
実際にこれをサーバーに送信します。
SELECT * FROM product WHERE serial_number = ((E'aB')::text);
これは、値を「テキスト」としてキャストしています。つまり、大文字と小文字を区別したルックアップが行われます。これを回避する方法は、Npgsql ソース コードを変更して「citext」タイプを追加することでした。このパラメーター タイプを使用すると、正しいコマンドが発行されます。
SELECT * FROM product WHERE serial_number = ((E'aB')::citext);
VARCHAR/TEXT の代わりに CITEXT データ型を使用できる場合があります。