他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

F.6. citext

citextモジュールは、大文字小文字の区別がない文字列型を提供します。 これは値の比較の際、基本的に内部的でlowerを呼び出します。 この他はほぼtextと同様に動作します。

F.6.1. 論拠

PostgreSQLにおいて大文字小文字の区別のない比較を行う標準的な手法は、値を比べる際に以下のようにlower関数を使用することでした。例です。

   SELECT * FROM tab WHERE lower(col) = LOWER(?);
  

これは合理的によく動作しますが、いくつか欠点があります。

citextデータ型によりSQL問い合わせ内のlower呼び出しを省くことができます。 さらに、大文字小文字の区別がないプライマリキーを実現できます。 citexttextと同様にロケールも考慮します。 つまり大文字と小文字の比較は、LC_CTYPEロケール設定の規則に依存します。 繰り返しますが、この動作はlowerを使用した問い合わせと同一です。 しかしこのデータ型によって透過的に行われますので、問い合わせで特殊なことを行うことを覚えておく必要はありません。

F.6.2. 使用法

簡単な例を示します。

   CREATE TABLE users (
       nick CITEXT PRIMARY KEY,
       pass TEXT   NOT NULL
   );

   INSERT INTO users VALUES ( 'larry',  md5(random()::text) );
   INSERT INTO users VALUES ( 'Tom',    md5(random()::text) );
   INSERT INTO users VALUES ( 'Damian', md5(random()::text) );
   INSERT INTO users VALUES ( 'NEAL',   md5(random()::text) );
   INSERT INTO users VALUES ( 'Bjørn',  md5(random()::text) );

   SELECT * FROM users WHERE nick = 'Larry';
  

SELECT文は、nick列が"larry"に設定され、問い合わせが"Larry"に対してであっても、1つのタプルを返します。

F.6.3. 文字列比較の動作

大文字小文字の区別のない照合をできる限り正確にエミュレートするために、citext独自版の各種比較演算子と関数があります。 例えば正規表現演算子~および~*は、citextに適用する時に同じ動作を提供します。 これら両方は大文字小文字を区別することなく比較します。 !~!~*だけではなくLIKE演算子、~~~~*!~~!~~*でも同じことが言えます。 もし大文字小文字を区別して比較したい場合は、いつでも比較前にtextにキャストすることができます。

引数がcitextであれば、同様にして以下の関数は大文字小文字を区別しない一致を実行します。

正規表現関数(RegExp関数)では、大文字小文字を区別して一致させたい場合"c"フラグを付けて、強制的に大文字小文字を区別して一致させることができます。 そうしないと、大文字小文字を区別させたい場合にはこれらの関数のいずれかを使用する前段階でtextにキャストしなければなりません。

F.6.4. 制限

F.6.5. Author

David E. Wheeler

Donald Fraserによるcitextモジュール原本でからの触発