無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

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 varying( n ) または character( n ) にキャストした場合、指定長を超えるとエラーなしで n 文字まで切り詰められます。 (これもまた標準 SQL の仕様です。)

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 型の値では、 LIKE や正規表現でのパターンマッチを行なう際、最後の空白は意味的に重要 なもの ですので、注意してください。

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

ティップ: 空白で埋められる型を使用した場合の保存領域の増加、および、長さ制限付きの列に格納する際に長さを検査するためにいくつか余計なCPUサイクルが加わる点を別にして、これら3つの型の間で性能に関する差異はありません。 他の一部のデータベースシステムでは character( n ) には性能的な優位性がありますが、 PostgreSQL ではこうした利点はありません。 実際には、格納の際に追加のコストがあるため、 character( n ) は3つの中でもっとも低速です。

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

例 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)); -- 明示的な切り捨て
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バイトの利用可能文字と終止文字)と定義されていますが、 C ソースコードにある NAMEDATALEN 定数を使って参照される必要があります。 この長さはコンパイル時に設定されます(そのため特別な用途に合わせ調整できます)。 デフォルトの最大長は今後のリリースで変更される可能性があります。 "char" (二重引用符に注意)は、 char(1) とは異なり、1バイトの領域しか使用しません。 過度に単純化した列挙型としてシステムカタログで内部的に使用されます。

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

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

powered by SEO.CUG.NET