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モードに関係なく、挿入値の余分な末尾スペースはサイレントクリップされます。PAD_CHAR_TO_FULL_LENGTH SQLモードが有効でない場合、CHAR 値を検索する際に末尾のスペースは削除されます。
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) の使用を推奨します。