SQL の CHAR と VARCHAR の違いについてです。
その前に、前提知識から確認していきましょう。
読み方
究極のところどっちでもいいのですが、個人的には
CHAR…キャラ
VARCHAR…バーキャラ
と呼んだほうが良いと思います。CHARはチャーと呼んでもいいですが、その場合、VARCHARがバー・チャーとなるのでちょっと間抜けな響きになります。
ちなみに語源はこちら
CHAR … CHARACTER →文字型
VARCHAR … VARIABLE CHARACTER →可変長文字型
まず、共通のこと
カッコ内はバイト数を記入します。終端文字(C言語のNULLみたいなもの)は不要です。
CHAR(バイト数)
VARCHAR(バイト数)
ここは文字数ではないので注意。
近代的なプログラミング言語はたいてい文字数ですよね。でもSQLは古いものなのでバイト数になってます。半角英数字なんかはアスキーコードなので1文字1バイトです。
日本語の扱い
古いSQLの本には、以下のようにあります。
全角文字を格納するには2バイト必要。100文字の全角文字を格納するには、100 x 2で CHAR(200)とする。
これは日本語=2バイト文字という古い時代の考え方です。SJIS(Shift-JIS)なんかがそうですね。
今は、UNICODE(UTF-8等)を利用することが多いため、1文字=3バイトの場合もあります。
(このあたりは処理系によって異なります。DB全体の設定、もしくはテーブル作成時に文字コードを指定します。)
上記の例だと100文字の全角文字を保存する場合は、UNICODEの処理系だとCHAR(300)になります。
メモ
このあたりの問題があるため、情報処理試験ではCHAR/VARCHARに日本語を入れる問題は出てきません。
本題。CHARとVARCHARの違い
CHARは100文字確保したところに1文字しか入れてなくてもDBのスペースを100バイト消費します。
VARCHARは可変的にスペースを変動させるため、VARCHAR(100)に1文字しか入れない場合、1バイトしか消費しません。逆に言うと99バイト節約できます。
使い分け
CHAR を使うべきところ
桁が固定されたIDなど。電話番号や郵便番号などもコードと言える。
コード設計されたような文字列。
VARCHARを使うべきところ。
コード以外。桁が固定されていない文字列、たとえばちょっとしたメモ、備考など。文章に近いものがこちら。表題、タイトル、概要。
※日本の人名くらいだとCHARで許される気がするが、国際対応する場合は100バイトを超えることもあるので、VARCHARが使われる。
※日本の人名くらいだとCHARで許される気がするが、国際対応する場合は100バイトを超えることもあるので、VARCHARが使われる。
注意 VARCHARは可変長文字列ではない
VARCHAR(100)として、101文字の文字列を入れるとエラーが出ます。自動的にサイズが大きくなる型ではありません。
このような、何桁になるか分からない長い文字列を入れる型はTEXT型などと呼ばれます。VARIABLEという言葉に惑わされないでください。
メモ
会社によっては、CHARを使わずに、VARCHARで統一されているところもあります。事前に確認しましょう。
また、VARCHARよりも、CHARの方が若干速度が速いという情報もあります。保存領域拡張処理が行われないから、その分速いのでしょうね。ただ、そんなのは微々たるものです。VARCHARによるデータ容量の削減のほうがメリットが多いと思います。