2007.11.27

どっちにする? CHAR と VARCHAR2

Oracle DB設計をする上で「文字列」の格納項目を
CHARにするかVARCHAR2にするか、
迷ったことはありませんか? 私はありません。

CHARは、固定長項目(区分、フラグなど)
VARCHAR2は、可変長項目(名称、備考など)

...と基本方針は決まってました。
(パッケージの場合は全部VARCHAR2が多いが)

ただ、その理屈を厳密に考えてみると
文字列項目は、極力 CHAR型の方が良いということに気がつきます。
(ハードリソースとシステムの規模にもよるが)

VARCHAR2データの場合、既にセットされている値よりも
バイト数の大きい値をUPDATEすると、断片化が起こりやすくなります。
なので極力CHAR型の方が良いということになります。

ここまでは判ったのですが、CHAR型にした場合、
SQLやPG上で不都合が生じるのではないかと
恥ずかしながら、今までは思っていました。
例えば、検索する際には、必ずTRIM関数を使う必要があるとか...。

しかし、その心配はいりません。
Oracle内部で自動的に桁数を合わせて検索してくれるので、
全く問題なく検索できます。

PGでは少々注意が必要かもしれません。
Javaの場合ですが、値をバインドする際に使用するメソッドを
setString ではなく、setFixedCHAR にする必要があります。

結論的には、以下の場合を除き、
理論的には極力CHAR型を採用した方が良いようです。

・リソースに余裕がない。
・空白文字そのものを格納したい
・やたら長い文字列

photo
minami