すべての値が固定幅の場合、CHAR が推奨されることはわかっています。しかし、だから何でしょうか? 安全のために、すべてのテキスト フィールドに VARCHAR を選択すればいいのではないでしょうか。
ベストアンサー1
一般的なルールとしては、すべての行の長さがほぼ同じである場合はCHARを選択します。長さが大幅に異なる場合はVARCHAR (またはNVARCHAR )を選択します。すべての行の長さが同じであるため、 CHAR の方が少し高速になることもあります。
DBの実装によって異なりますが、一般的に、VARCHAR(またはNVARCHAR)は、実際のデータに加えて、1バイトまたは2バイトのストレージ(長さまたは終了用)を使用します。したがって、(1バイトの文字セットを使用していると仮定して)「FooBar」という単語を格納すると、
- CHAR(6) = 6バイト(オーバーヘッドなし)
- VARCHAR(100) = 8バイト(オーバーヘッド2バイト)
- CHAR(10) = 10バイト(4バイトは無駄)
つまり、比較的同じ長さ (2 文字の長さの差以内) のデータの場合、CHAR の 方が高速で、スペース効率も高くなります。
注: Microsoft SQL では、VARCHAR に対して 2 バイトのオーバーヘッドがあります。これは DB によって異なる場合がありますが、一般的に、VARCHAR の長さまたは EOL を示すには少なくとも 1 バイトのオーバーヘッドが必要です。
コメントでGavenが指摘したように、マルチバイト文字セットになると状況が変わり、VARCHAR の方がはるかに良い選択となる場合があります。
VARCHARの宣言された長さに関する注意: 実際のコンテンツの長さが格納されるため、未使用の長さが無駄になりません。したがって、VARCHAR(6)、 VARCHAR(100)、またはVARCHAR(MAX)に 6 文字を格納すると、同じ量のストレージが使用されます。 VARCHAR(MAX)を使用する場合の違いの詳細については、こちらをご覧ください。 VARCHAR で最大サイズを宣言して、格納される量を制限します。
コメントでAlwaysLearning は、 Microsoft Transact-SQL ドキュメントではその逆のことが書かれているようだと指摘しました。これは間違いか、少なくともドキュメントが不明瞭であると思います。