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が良いかな。。。と思います。