表8.4 文字型
型名 | 説明 |
---|---|
character varying( , varchar( | 上限付き可変長 |
character( , char( , bpchar( | 空白で埋められた固定長 |
text | 制限なし可変長 |
表 8.4はPostgreSQLで使用可能な汎用文字型を示したものです。
《マッチ度[66.921769]》SQLは2つの主要な文字データ型を定義しています。
character varying(
とn
)character(
です。
ここでn
)n
は正の整数です。
これらのデータ型は2つともn
文字長(バイト数ではなく)までの文字列を保存できます。
上限を越えた文字列をこれらの型の列に保存しようとするとエラーになります。
ただし、上限を超えた部分にある文字がすべて空白の場合はエラーにはならず、文字列の最大長にまで切り詰められます。
(この一風変わった例外は標準SQLで要求されています。)
もし宣言された上限よりも文字列が短い時はcharacter
の値は空白で埋められ、character varying
の値は単にその短い文字列で保存されます。
《機械翻訳》SQLは、character varying(
とn
character(
の2つのプライマリ文字タイプを定義します。
n
n
は正の整数です。
これらのタイプはどちらも、長さにn
文字(バイトではありません)までの文字列を格納できます。
これらのタイプのカラムに長い文字列を格納しようとすると、余分な文字がすべてスペースでない限り、エラーが生成され、ケースの文字列は最大の長さに切り捨てられます(このやや奇妙な例外はSQL標準で必要とされています)。
ただし、character varying(
またはn
)character(
に明示的に値をキャストすると、長さを超える値は、エラーを発生させることなく、n文字に切り捨てられます(これもまた、SQLL標準で必要とされています)。
格納される文字列が宣言された長さより短い場合、タイプの文字の値はスペースでパディングされます。
タイプの文字の値は単に短いを格納します。
n
)
《機械翻訳》さらに、PostgreSQLは、任意のタイプの文字列を格納するテキスト
長さを提供します。
テキスト
タイプはSQL標準にはありませんが、他のいくつかのSQLデータベース管理システムにもあります。
テキスト
はPostgreSQLのネイティブ文字列データタイプであり、文字列を操作するほとんどの組み込み関数は、character varying
ではなく、または結果テキスト
を取るように宣言されています。
多くの目的のために、character varying
はテキスト
に対するドメインであるかのように動作します。
《機械翻訳》タイプ名前varchar
はcharacter varying
の別名で、char
とbpchar
はcharacter
のエイリアスです。
varchar
とchar
のエイリアスはSQL標準で定義されていますが、bpchar
はPostgreSQLextensionです。
《機械翻訳》指定する場合、長さn
はより大きいゼロでなければならず、10485760を超えることはできません。
長さ指定子なしのcharacter
はcharacter(1)
と同じです。
長さ指定子なしでcharacter varying
を使用する場合、タイプは任意のサイズの文字列を受け入れます。
character
型の値は、指定長n
になるまで物理的に空白で埋められ、そのまま格納、表示されます。
しかし、最後の空白は、重要ではないものとして扱われ、2つのcharacter
型の値を比べる際には無視されます。
空白が重要な照合順序では、この挙動は予期しない結果を返す可能性があります。例えば、SELECT 'a '::CHAR(2) collate "C" < E'a\n'::CHAR(2)
はC
ロケールでスペースが改行よりも大きいにも関わらず真を返します。
character
値を他の文字列型に変換する際は、文字列の終わりの空白は除去されます。
character varying
型とtext
型の値の中や、パターンマッチを行なう際、すなわちLIKE
や正規表現では、最後の空白は意味的に重要なものですので、注意してください。
これらのデータ型のいずれかに格納できる文字はデータベースを作成するときに選択されるデータベースキャラクタセットによって決定されます。 特定のキャラクタセットに関わらず、コード0(時にはNULと呼ばれます)を格納することはできません。 より詳細な情報は24.3を参照ください。
短い文字列(126バイトまで)の保存には、実際の文字列に1バイト加えたサイズが必要です。
character
では空白埋め込み分もこれに含まれます。
より長い文字列では1バイトではなく4バイトのオーバーヘッドになります。
長い文字列はシステムにより自動的に圧縮されますので、ディスク上の物理的必要容量サイズはより小さくなるかもしれません。
また、非常に長い値はより短い列の値への高速アクセスに干渉しないように、バックグラウンドテーブルに格納されます。
いずれの場合にあっても保存できる最長の文字列は約1ギガバイトです。
(データ型宣言に使われるn
に許される最大値はこれより小さいものです。
マルチバイト文字符号化方式においては文字数とバイト数はまったく異なっているため、この値の変更は便利ではありません。
特定の上限を設けずに長い文字列を保存したい場合は、適当な上限を設けるよりも、text
もしくは長さの指定がないcharacter varying
を使用してください。)
空白で埋められる型を使用した場合の保存領域の増加、および、長さ制限付きの列に格納する際に長さを検査するためにいくつか余計なCPUサイクルが加わる点を別にして、これら3つの型の間で性能に関する差異はありません。
他の一部のデータベースシステムではcharacter(
には性能的な優位性がありますが、PostgreSQLではこうした利点はありません。
実際には、格納の際に追加のコストがあるため、n
)character(
は3つの中でもっとも低速です。
多くの場合、代わりにn
)text
かcharacter varying
を使うのがお薦めです。
文字列リテラルの構文については4.1.2.1、利用可能な演算子と関数については第9章を参照してください。
例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
PostgreSQLには、表 8.5に示すように、この他2つの固定長文字型があります。
これらは一般的な使用を目的としたものではなく、内部的なシステムカタログでのみ使用することを意図しています。
name
型は識別子を格納するために使われます。
現在長さは64バイト(63バイトの利用可能文字と終止文字)と定義されていますが、C
ソースコードにあるNAMEDATALEN
定数を使って参照される必要があります。
この長さはコンパイル時に設定されます(そのため特別な用途に合わせ調整できます)。
デフォルトの最大長は今後のリリースで変更される可能性があります。
"char"
(二重引用符に注意)は、char(1)
とは異なり、1バイトの領域しか使用せず、このため、シングルバイトのASCII文字のみを格納することができます。
過度に単純化した列挙型としてシステムカタログで内部的に使用されます。
表8.5 特別な文字データ型
型名 | 格納サイズ | 説明 |
---|---|---|
"char" | 1バイト | 単一バイト内部データ型 |
name | 64バイト | オブジェクト名用の内部データ型 |