CHAR と VARCHAR タイプは似ていますが、ストレージと検索の方法、最大長、および末尾のスペースを保持するかどうかに違いがあります。
CHAR
CHAR タイプは、宣言された長さが保存できる最大文字数を表します。例えば、CHAR(30) は最大30文字を収容できることを意味します。
構文は以下のとおりです:
[NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]
CHARACTER SET は文字セットを指定するために使用されます。必要に応じて、COLLATE プロパティやその他のプロパティを使用して文字セットの照合順序を指定できます。CHARACTER SET のバイナリプロパティを指定した場合、列は対応するバイナリ文字列データ型として作成され、CHAR は BINARY に変更されます。
CHAR 列の長さは0から256の値を指定できます。CHAR 値を保存する際には、指定された長さまで右側にスペースで補完されます。
CHAR 列では、SQLモードに関係なく、挿入値の余分な末尾のスペースはサイレントに切り捨てられます。CHAR 値を検索する際、PAD_CHAR_TO_FULL_LENGTH SQLモードが有効になっていない場合、末尾のスペースは削除されます。
VARCHAR
VARCHAR タイプは、宣言された長さ M が保存できる最大文字数を表します。例えば、VARCHAR(50) は最大50文字を収容できることを意味します。
構文は以下のとおりです:
[NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name]
CHARACTER SET は文字セットを指定するために使用されます。必要に応じて、COLLATE プロパティやその他のプロパティを使用して文字セットの照合順序を指定できます。CHARACTER SET のバイナリプロパティを指定した場合、列は対応するバイナリ文字列データ型として作成され、VARCHAR は VARBINARY に変更されます。
VARCHAR 列の長さは0から262144の値を指定できます。
CHAR と比較して、VARCHAR 値は1バイトまたは2バイトの長さのプレフィックスとデータを組み合わせて保存されます。長さのプレフィックスは、値内のバイト数を示します。値が255バイト以下の場合、この列は1文字を占有し、値が255バイトを超える可能性がある場合は2文字を占有します。
VARCHAR 列では、SQLモードに関係なく、列の長さを超える末尾のスペースは挿入前に切り捨てられ、アラートが生成されます。
VARCHAR 値は保存時に補完されません。標準SQLによれば、値の保存および検索時に末尾のスペースは保持されます。
また、OceanBaseデータベースは拡張タイプ CHARACTER VARYING(m) もサポートしていますが、VARCHAR(m) の使用を推奨します。