SQLPlus で
SELECT * FROM v$version;
を打ち込む。するとこんな感じで帰ってくる。
SQL> SELECT * FROM v$version;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE 9.2.0.1.0 Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production
チラシの裏, データベース
データベースの char と varchar の違いについて気になったので調べてみた。
まず基本は char は固定長であり、varchar は可変長である。
char 型のカラムに指定サイズに満たないデータを入れた場合、不足バイト分のスペースで埋められる。たとえば、8 バイトの char 型のカラムに「test」という文字を挿入すると、データベースには「test____」(_はスペース)というデータで格納される。
一方、varchar 型のカラムに指定サイズに満たないデータを入れても、不足バイト分をスペースで埋められない。
128 バイトの varchar 型のカラムに「test」という文字を挿入しても、「test」というデータが格納される。
char 型と varchar 型をどう使い分けるのが良いかというのは DB アドミニストレータとプログラマの視点によって変わってくる。
char 型のカラムはデータ挿入時に指定サイズ分が記憶領域に確保されるが、varchar 型のカラムでは必要な分のみ確保される。
varchar 型のカラムのデータを格納されているデータより大きなサイズのデータに更新しようとしたときに、再度記憶領域のサイズを確保する処理が行われる事がある。
パフォーマンスに敏感になっている DB アドミニストレータからしてみると、この些細な点でも気になることだろう。
しかし、プログラマからしてみると char 型のサイズの不足分がスペースで埋められる点がかなり痛い。
先ほど挿入した「test」という文字を検索条件にクエリを発行しても、ヒットしない。なぜなら、検索する場合は「test____」というスペースを含めた文字で検索する必要があるからだ。この事から少しでもプログラマは varchar 型で定義して、早く実装して幸せになりたいだろう。OR マッピングが色々な言語で使える環境が揃ってきて、こういう細かい事を気にする必要が無くなってきた感があるかもだけど、やはりこういう細かい点は見逃せない。。。
使い分ける場面としては電話番号などの長さが必ず固定である場合は char 型、コメントなどのデータによって長さが変わってくる場合は varchar 型を使うって感じだろか。
ちなみに Oracle の varchar には varchar と varchar2 があるが、それぞれ、254 バイト以下、4000 バイト以下の可変長文字列を表す。
データベース, プログラミング