8.3. 文字型

表 8-4. 文字型

型名説明
character varying(n), varchar(n)上限付き可変長
character(n), char(n)空白でパッドされた固定長
text制限無し可変長

表8-4は、PostgreSQLで使用可能な汎用文字型を示したものです。

SQLは2つの主要な文字データ型を定義しています。 character varying(n)character(n)です。 ここでnは正の整数です。 これらのデータ型は2つともn文字長までの文字列を保存できます。 超過している文字がすべて空白の場合を除いて、上限を越えた文字列をこの型の列に保存しようとするとエラーになります。 すべて空白の場合は長さの限界で切り捨てられます。 (この一風変わった例外は標準SQLで要求されています。) もし宣言された上限よりも文字列が短い時はcharacterの値は空白で埋められ、character varyingの値は単にその短い文字列で保存されます。

character(n)またはcharacter varying(n)に明示的に値をキャストすると、値が長すぎる場合、エラーを出さずに文字がn個に切り捨てられます。 (これもまた標準SQLで要求されています。)

注意: PostgreSQLの7.2より前のバージョンでは、キャストが明示か暗黙かを問わず、長過ぎる文字列は常にエラーを出さずに切り捨てられていました。

char(n)およびvarchar(n)という表記法はそれぞれcharacter(n)character varying(n)の別名です。 長さ指定がないcharactercharacter(1)と同じです。 character varyingが長さ指定なしで使われた時は、いかなる長さの文字列でも受け付けます。 後者はPostgreSQLの拡張です。

さらにPostgreSQLは、いかなる長さの文字列でも格納できるtextをサポートします。 text型は標準SQLにはありませんが、多くの他のSQLデータベース管理システムも同様にサポートしています。

これらの型のデータに必要な保存サイズは実際の文字列サイズに4バイトを加えたもので、characterではパッド分が加わります。 長い文字列はシステムで自動的に圧縮されますので、ディスク上の物理的必要容量は少なくなります。 また、長い値はより短い列の値への高速アクセスに干渉しないように、バックグラウンドテーブルに格納されます。 いずれの場合にあっても保存できる最長の文字列は約1GBです。 (データ型宣言に使われるnに許される最大値はこれより小さいものです。 マルチバイト文字符号化方式においては文字数とバイト数はまったく異なっているためcharacter型の変更はそれほど便利ではありません。 特定の上限を設けずに長い文字列を保存したい場合は、任意の上限を設けるよりも長さの指定が無いtextもしくはcharacter varyingを使用してください。)

ティップ: 空白でパッドされる型を使用した場合の保存領域の増加を別にして、これら3つの型の間で性能に関する差異はありません。

文字列リテラルの構文については項4.1.2.1、そして、利用可能な演算子と関数については第9章を参照してください。

例 8-1. 文字データ型を使って

CREATE TABLE test1 (a character(4));
INSERT INTO test1 VALUES ('ok');
SELECT a, char_length(a) FROM test1; -- (1)
  a   | char_length
------+-------------
 ok   |           4

CREATE TABLE test2 (b varchar(5));
INSERT INTO test2 VALUES ('ok');
INSERT INTO test2 VALUES ('good      ');
INSERT INTO test2 VALUES ('too long');
ERROR:  value too long for type character varying(5)
INSERT INTO test2 VALUES ('too long'::varchar(5)); -- explicit truncation
SELECT b, char_length(b) FROM test2;
   b   | char_length
-------+-------------
 ok    |           2
 good  |           5
 too l |           5
(1)
char_length関数は項9.4で説明されています。

PostgreSQLには、表8-5に示すように、この他2つの固定長文字型があります。 name型は内部のシステムカタログ内の識別子の格納のためにのみ存在するもので、一般ユーザによって使用されることを意図していません。 現在長さは64バイト(63バイトの利用可能文字と終止文字)と定義されていますが、NAMEDATALEN定数を使って参照される必要があります。 この長さはコンパイル時に設定されます(そのため特別な用途に合わせ調整できます)。 デフォルトの最大長は今後のリリースで変更される可能性があります。 "char"(二重引用符に注意)は、その中に1バイトの保存サイズしか使用しないchar(1)とは異なります。 貧乏人の列挙型としてシステムカタログで内部的に使用されます。

表 8-5. 特別な文字データ型

型名格納サイズ説明
"char"1バイト単一文字内部データ型
name64バイトオブジェクト名用の内部データ型