このトピックでは、文字タイプの定義と構文について説明します。
文字タイプ
名前 | 説明 |
| 長さが可変で制限されている文字。 |
| 長さが固定され、スペースで埋められている文字。 |
| 長さが可変で無制限の文字。 |
CLOB | 長さが可変で、最大1 GBの大きな文字列。 |
ロング | 長さが可変で無制限の文字列。 |
NVARCHAR(n) | 長さが可変で制限されている文字列。 |
NVARCHAR2(n) | 長さが可変で制限されている文字列。 |
ストリング | VARCHAR2型のエイリアス。 |
VARCHAR2(n) | 長さが可変で制限されている文字列。 |
SQLは、character variing (''n') とcharacter ('n') の2つの基本的な文字タイプを定義しています。 nは正の整数である。 どちらのタイプにも、最大n文字の文字列を格納できます。 余分な文字がすべてスペースでない限り、長い文字列がこれらの型の列に格納されるとエラーが発生します。 余分な文字がすべてスペースの場合、文字列は最大長に切り捨てられます。 この例外は、SQL標準で必要です。 格納される文字列の長さが指定された長さより短い場合、文字型の値はスペースでパディングされますが、文字可変型の値は単純に短い文字列を格納します。
ただし、character variing (''n') 型またはcharacter(''n') 型に値を明示的にキャストした場合、指定した長さより長い値はn文字に切り捨てられ、エラーは報告されません。 これは、SQL標準によっても要求される。
varchar(''n') はcharacter variing (n) のエイリアスであり、char(''n') はcharacter ('n' '') のエイリアスです。 長さ指定子のないcharacter型は、character(1) 型と同じです。 文字可変型に長さ指定子がない場合、型は任意の長さの文字列をサポートします。 character (1) 型は、PolarDB for PostgreSQL (Oracleと互換性があります) の拡張です。
さらに、PolarDB for PostgreSQL (Oracleと互換) は、任意の長さの文字列を格納するtext型を提供します。 text型はSQL標準ではありませんが、いくつかのSQLデータベース管理システムがテキスト型をサポートしています。
character型の値は、指定されたn文字の長さまでスペースで物理的にパディングされ、このように格納および表示されます。 ただし、末尾のスペースは意味的に重要でないと見なされ、文字タイプの2つの値を比較すると無視されます。 スペースが重要な照合では、この動作は予期しない結果を生み出す可能性があります。 たとえば、SELECT 'a '::CHAR(2) collate "C" < E'a\n'::CHAR(2) は、Cロケールでスペースが改行よりも大きいと見なされた場合でも、trueを返します。 文字値を他の文字列型のいずれかに変換すると、末尾のスペースが削除されます。 後続のスペースは、character variingやtextの値、およびLIKE演算子または正規表現を使用してパターンマッチングを実行する場合に意味的に重要です。
これらのタイプの文字列の格納には、4バイトに文字列の実際の長さを加えたものが必要です。 文字タイプの文字列の場合、パディングされたスペースも含まれます。 長い文字列はシステムによって自動的に圧縮されます。 したがって、ディスク上のより少ない物理的空間が必要とされ得る。 長い値もバックグラウンドテーブルに格納されます。 このように、長い値は短い列値への迅速なアクセスを妨げません。 格納できる文字列の長さは最大1 GBです。 データ型宣言でnに許可される最大値は1 GB未満です。 マルチバイト符号化では、文字とバイトの数が全く異なる可能性があるため、これを変更することは有用ではない。 特定の上限なしで長い文字列を格納する場合は、任意の長さ制限を指定する代わりに、長さ指定子なしでテキスト型または文字可変型を使用します。 短い文字列 (最大126バイトの長さ) を格納するには、1バイトに文字列の実際の長さを加えたものが必要です。この長さには、文字列が文字型の場合はパディングされたスペースが含まれます。 長い文字列には、1バイトではなく4バイトのオーバーヘッドが必要です。 長い文字列はシステムによって自動的に圧縮されます。 したがって、ディスク上のより少ない物理的空間が必要とされ得る。 長い値もバックグラウンドテーブルに格納されます。 このように、長い値は短い列値への迅速なアクセスを妨げません。 格納できる文字列の長さは最大1 GBです。 データ型宣言でnに許可される最大値は1 GB未満です。 マルチバイト文字エンコードでは、文字とバイトの数がまったく異なる可能性があるため、これを変更することは有用ではありません。 特定の上限なしで長い文字列を格納する場合は、任意の長さ制限を指定する代わりに、長さ指定子なしでtext型またはcharacter variable型を使用します。
3つのタイプにはパフォーマンスの違いはありません。ただし、スペースが埋め込まれたタイプを使用するとストレージスペースが増加し、タイプの値が長さが制限された列に格納されるときに長さをチェックするための少数の余分なCPUサイクルがあります。 character(n) 型は、一部のデータベースシステムではパフォーマンス上の利点がありますが、PolarDB for PostgreSQL (Oracle互換) ではこのような利点は適用されません。 実際、character(n) のタイプは、追加のストレージコストを必要とするため、3つのタイプの中で最もパフォーマンスが遅いです。 ほとんどの場合、テキストまたは文字可変のタイプが好ましい。
次のサンプルコードは、文字型の使用方法の例を示しています。
CREATE TABLE test1 (文字 (4));
test1値に挿入する ('ok');
SELECT a, char_length(a) FROM test1; -- (1)
a | char_length
------+-------------
ok | 2
CREATE TABLE test2 (b varchar(5));
test2値に挿入する ('ok');
test2値に挿入する ('good ');
test2値に挿入する (「長すぎる」) 。
ERROR: 型文字の変化には長すぎる値 (5)
INSERT INTO test2 VALUES ('too long '::varchar(5)); -明示的な切り捨て
SELECT b, char_length(b) FROM test2;
b | char_length
-------+-------------
ok | 2
良い | 5
too l | 5 PolarDB for PostgreSQL (Oracleと互換) は、別の2つの固定長文字型をサポートしています。 name型は、内部システムカタログに識別子を格納するためにのみ使用され、汎用的なものではありません。 name型の長さは64バイトと定義されており、63文字の使用可能文字とターミネータが含まれています。 名前の型は、CソースコードでNAMEDATALEN定数を使用して参照する必要があります。 長さはコンパイル時に指定されるため、特別な目的で調整できます。 デフォルトの最大長は、将来のリリースで変更され得る。 "char" 型 (二重引用符に注意) は、char(1) 型とは異なります。 "char" 型は1バイトのストレージのみを使用します。 したがって、"char" 型は、単純な列挙型としてシステムカタログで使用されます。
特殊文字タイプ
名前 | ストレージサイズ | 説明 |
| 1 バイト | 1バイトの内部型。 |
| 64バイト | オブジェクト名の内部型。 |