Table 5-4. 文字列データ型
型名 | 説明 |
---|---|
character(n), char(n) | 空白でパッドされた固定長文字列 |
character varying(n), varchar(n) | 制限付き可変長文字列 |
text (テキスト) | 制限無し可変長文字列 |
Table 5-4 は、PostgreSQL で使用可能な汎用文字データ型をリストしたものです。
SQL は 2 つの主要な文字データ型を定義しています。character(n) と character varying(n) で、n は正の整数です。これらのデータ型は 2 つとも長さにして n 文字分の文字列を保存できます。超過している文字がすべてスペースの場合(この時は長さの限界で切り捨てられます)を除いて、上限を越えた文字列をこの種の列に保存しようとするとエラーになります。 (この一風変わった例外は SQL 標準で要求されています。もし宣言された上限よりも文字列が短いときは character の値はスペースで埋められ、character varying の値は単にその短い文字列で保存されます。
Note: character(n) または character varying(n) に明示的に値をキャストすると、 値が長すぎる場合、エラーを出さずに文字が n 個に切り捨てられます。 (これもまた SQL 標準で要求されています。)
Note: PostgreSQL の 7.2 より前のバージョンでは、キャストが明示か暗黙かを問わず、長過ぎる文字列は常にエラーを出さずに切り捨てられていました。
char(n) および varchar(n) という表記法はそれぞれ character(n) と character varying(n) の別名です。長さが指定されない character は character(1) と同じです。character varying が長さの指定なしで使われたときは、いかなる長さの文字列でも受け付けます。後者は PostgreSQL の拡張です。
さらに PostgreSQL はより一般的な text をサポートし、いかなる長さの文字列でも保存します。character varying とは異なり text は明示的に文字列の長さの上限を宣言する必要がありません。 text は SQL 標準にはありませんが多くの他の RDBMS パッケージにも入っています。
これらのデータ型のデータに必要な保存サイズは実際の文字列サイズに 4 バイトを加えたもので、character ではパッド分が加わります。 長い文字列はシステムで自動的に圧縮されるので、ディスク上の物理的必要容量は少なくなるでしょう。 また、長い値は、より短い列の値への高速アクセスに干渉しないように、バックグラウンドテーブルに格納されます。いずれの場合にあっても保存できる最長の文字列は約 1 GB です。(データ型宣言に使われる n に許される最大値はこれより小さいものです。マルチバイト文字符号化方式に於いては文字数とバイト数はまったく異なっているため character 型の変更はそれほど便利ではありません。特定の上限を設けずに長い文字列を保存したい場合は、任意の上限を設けるよりも長さの指定が無い text もしくは character varying を使用します。
Tip: 空白でパッドされた型を使用した場合の保存領域の増加を別にして、これら 3 つの型の間でパフォーマンスに関する差異はありません
文字列リテラルの構文については Section 1.1.2.1、そして利用可能な演算子と関数については Chapter 6 を参照ください。
Example 5-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
PostgreSQL にはこのほか 2 つの固定長文字データ型があります。これらは Table 5-5 に示されています。name は内部のカタログ名の保存のためにのみ存在するもので、一般ユーザによって使用されることを意図していません。 現在長さは 64 バイト (63 バイトの利用可能文字と終止文字) と定義されていますが、定数 NAMEDATALEN を使って参照される必要があります。 長さはコンパイル時に設定されます (そのため特別な用途に合わせ調整できます)。デフォルトの最大長は今後変更になる可能性があります。"char" (二重引用符に注意)はその中に 1 バイトの保存サイズしか使用しない char(1) とは異なります。できの悪い(?)デべロッパーが数を数えるためのデータ型としてシステムカタログで内部的に使用されます。