★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 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.7. citext

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

F.7.1. 論拠

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

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

これはまあまあ動作しますが、数多くの欠点があります。

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

F.7.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.7.3. 文字列比較の動作

citextはそれぞれの文字列を(lowerが呼ばれますが)小文字に変換して結果を普通に比較します。 よって、例えばlowerで小文字にした場合に同じ結果となるような2つの文字列が等しいとみなされます。

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

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

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

F.7.4. 制限

F.7.5. 作者

David E. Wheeler

Donald Fraserによるcitextモジュール原本からのヒント