文字型

PostgreSQL 8.0.0 文書
前のページ | 巻戻し | 第 8章データ型 | 早送り | 次のページ

# 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`)`の別名です。 長さ指定がない`character`は`character(1)`と同じです。 `character varying`が長さ指定なしで使われた時は、いかなる長さの文字列でも受け付けます。 後者はPostgreSQLの拡張です。

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

`character`型の値は、指定長`n`になるまで物理的に空白で埋められ、そのまま格納、表示されます。 しかし、追加された空白は意味的に重要ではないものとして扱われます。 最後の空白は、2つの`character`型の値を比べる際には無視されます。 また、`character`値を他の文字列型に変換する際には除去されます。 `character varying`型と`text`型の値では、最後の空白は意味的に重要なものですので、注意してください。

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

> ティップ: 空白でパッドされる型を使用した場合の保存領域の増加を別にして、これら3つの型の間で性能に関する差異はありません。 他の一部のデータベースシステムでは`character(`n`)`には性能的な優位性がありますが、PostgreSQLではこうした利点はありません。 ほとんどの状況では、代わりに`text`や`character varying`が使用されます。

文字列リテラルの構文については項4.1.2.1、そして、利用可能な演算子と関数については第9章を参照してください。 データベースの文字セットは、テキストの値を格納する時に使用される文字セットを決定します。 文字セットのサポートに関する詳細については項20.2を参照してください。

例 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   |           2

    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バイト | 単一文字内部データ型
`name` | 64バイト | オブジェクト名用の内部データ型

前のページ | ホーム | 次のページ
通貨型 | 上に戻る | バイナリ列データ型