charとvarcharの使用判断について

文字列をDBに格納するとき、charにするかvarcharにするか選択をする必要がある。

  • 使用ディスク量からの視点
    • データ領域を10バイトで定義して3バイトのデータを格納する場合を考えてみる。charの場合、10バイトの領域を確保した上で3バイトのデータを格納するので7バイト分未使用量の領域が発生する。これに対し、varcharの場合、3バイトの領域を確保して3バイトのデータを格納する。使用ディスク容量だけをみるとvarcharのほうがお得感がある。
  • 更新性能からの視点
    • 使用ディスク容量から見るとお得感のあるvarcharaにもデメリットはある。たとえば3バイトのディスク容量を格納した後で5バイトのデータを格納する場合、余計なディスクI/Oが発生するのである。
  • まとめ
    • 各データの文字列長にそんなに差異がない場合や更新が比較的おおい場合は性能を考えてcharにする。
    • 登録した後、更新はほとんどない場合は、データ領域の節約を考慮してvarcharにする。
    • 文字列長がばらばらなデータの場合、ディスク領域と相談。(ディスク領域に余裕があればchar、なければvarchar)
  • 補足

mysqlには、TEXTという型もある。
ユニーク属性を付ける場合はVARCHARで、
ユニーク属性を付けない場合はTEXTでよいと思う。
mysqlには、TEXT型のカラムにユニーク属性をつける場合、最大長を指定しないとだめなのだが、
指定した最大長を越えるとユニーク属性をつけた意味がなくなるなど、ややこしい話がある。
なので、ユニーク属性を付ける可能性があるようなデータは、varcharでカラムを作成したほうがよいと思う。

  • おまけ
    • ふと思った疑問だが、varchar(10)の10って指定する意味があるんだろうか?と思ってしまう。varchar(10)と定義しても、3文字のデータ入れようとしたら、3文字分の領域を確保して3文字のデータを入れるという話だから、意味ないのでは?11文字以上のデータを入れるようとすると、はみだした部分はきられちゃうらしいから、将来のディスク容量を予想するという意味で必要なのかなぁ。。