値の格納

PostgreSQL 9.1.1文書
前のページ | 巻戻し | 第 10章型変換 | 早送り | 次のページ

# 10.4. 値の格納

以下の手順に従って、テーブルに挿入される値は対象とする列のデータ型に変換されます。

値の格納における型変換

1. 対象に正確に一致するかどうかを検査します。

2. なければ、式を対象の型に変換してみます。 もし2つの型の間のキャストが登録されている場合、これは成功します。 もし式がunknown型リテラルの場合、リテラル文字列の内容は対象の型の入力変換ルーチンに与えられます。

3. 対象の型に対してサイズ調整キャストがあるかどうかを検査します。 サイズ調整キャストは、ある型からその同じ型へのキャストです。 `pg_cast`カタログに1つ見つかった場合は、格納先の列に収納する前に式に適用します。 こうしたキャストを実装する関数は、常に`integer`型のパラメータを1つ余計に取ります。 このパラメータは、格納先の列の`atttypmod`値を受け付けます （`atttypmod`の解釈方法はデータ型によって異なりますが、典型的にはそれの宣言された長さです）。 また、キャストが明示的か暗黙的かを示す、第三の`boolean`パラメータを取ることもできます。 サイズ検査や切り詰めなど、長さに依存したセマンティックスの適用について、キャスト関数が責任を持ちます。

例 10-6. `character`格納における型変換

`varchar(20)`として宣言された対象の列への以下の文では、対象の大きさが正確に調整されることを示します。

    CREATE TABLE vv (v character(20));
    INSERT INTO vv SELECT 'abc' || 'def';
    SELECT v, octet_length(v) FROM vv;

              v           | octet_length
    ----------------------+--------------
     abcdef               |           20
    (1 row)

ここで実際に起こったのは、デフォルトで`||`演算子が`text`の連結として解決できるように、2つのunknownリテラルが`text`に解決されたということです。 そして演算子の`text`型の結果は対象の列の型に合うように`bpchar`("空白が埋められる文字", `character`データ型の内部名)に変換されます （しかし、`text`から`bpchar`へバイナリ変換可能ですので、この型変換のために実際の関数呼び出しは挿入されません）。 最後に、`bpchar(bpchar, integer, boolean)`サイズ調整関数がシステムカタログの中から見つかり、演算子の結果と格納する列の長さを適用します。 この型特有の関数は必要とされる長さを検査し、空白の埋め込みを行います。

前のページ | ホーム | 次のページ
関数 | 上に戻る | `UNION`、`CASE`および関連する構文