Table 3-4. 文字列データ型
型名 | 説明 |
---|---|
character(n), char(n) | 空白でパッドされた固定長文字列 |
character varying(n), varchar(n) | 制限付き可変長文字列 |
text | 制限無し可変長文字列 |
SQL は 2 つの主要な文字データ型を定義しています。 character(n) と character varying(n) で、n は正の整数です。これらのデータ型は 2 つとも長さにして n 文字分の文字列を保存できます。超過している文字がすべてスペースの場合(この時は長さの限界で切り捨てられます)を除いて、上限を越えた文字列をこの種の列に保存しようとするとエラーになります。(この一風変わった例外は SQL 標準で要求されています。)もし宣言された上限よりも文字列が短いときは character の値はスペースでパッドされ、 character varying の値は単により短く保存されます。
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 4 を参照ください。
Example 3-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) SELECT b, char_length(b) FROM test2; b | char_length -------+------------- ok | 2 good | 5
PostgreSQL にはこのほか 2 つの固定長文字データ型があります。name は内部のカタログ名の保存のためにのみ存在するもので、一般ユーザによって使用されることを意図していません。現在長さは 32 バイト(31 バイトの利用可能文字と終止文字)と定義されていますが、マクロ NAMEDATALEN を使って参照されなければなりません。長さはコンパイル時に(と言うことは特別の目的には調整が可能です)設定されます。デフォルトの最長限度は将来のリリースで変更される可能性があります。 "char" (二重引用符に注意)はその中に 1 バイトの保存サイズしか使用しない char(1) とは異なります。できの悪い(?)デべロッパーが数を数えるためのデータ型としてシステムカタログで内部的に使用されます。