[SQL Server] varcharとchar

varcharとchar

テーブル設計をする時、varchar(nvarchar)かcha(nchar)rか迷う時ありませんか?

私の場合、感覚で決めてしまっているので、良い習慣ではありません。
そこで、少しまとめてみようと思いました。

[格納サイズ]
 charは設定したバイト数がそのまま格納サイズになります。
 varcharは入力されたバイト数+2バイトが格納サイズになります。

 このことから、
  ・列データ エントリが類似したサイズになると想定される場合は、char を使用します。
  ・列データ エントリのサイズがある程度異なると想定される場合は、nvarchar を使用します。

[プログラムから見た取扱のしやすさ]
 プログラミングの理由で、DB設計が影響を受けることは余り好ましくないというのが前提。でも少しだけ。
  SQLで取り扱う場合、データ長を合わせてあると思いますので、問題に成りませんが、
  ・charはデータ長が足らない場合は空白で埋めるため、使用する際に空白が不要な場合はトリムする必要がある。
  ・上と同じ理由から、検索する際も空白で埋めてからDBへ渡す必要がある。
  ・データ長が将来拡張することが微妙に予定されている場合、varcharの方が考慮しなくて済みそう。

  私はvarcharに1票入れます。

[パフォーマンス]
 検索パフォーマンスについては、実際さっぱり判りません^^;
 基本的にはDBがメモリに読み込むデータ長と検索対象のテーブルのレコード長の方がより影響が大きいと考えられます。
 結果、どちらを採用しても最適化する工程が必要ということです。

 更新パフォーマンスについてもほぼ同じ考えです。
 1つの列だけでパフォーマンスは決まらないので、全体で考える必要があると思いますので。
 charの場合、not NULLにしておけば、データ更新時にあふれが発生しませんので少し有利かともおもいます。
 varcharの場合は、更新時にデータがきちきちに詰まっているとあふれが発生します。
 その際は、別のブロックに移動するためパフォーマンスが低下する可能性が高くなります。

 一度に大きなデータを処理するなら、考慮する必要が有るかも知れません。
 しかし、そうなるとやはり全体最適化となるので。。。良く分かりません^^;

結果は、varcharが基本で入力データが固定長の場合のみcharが良いかな。。。と思います。