オブジェクティブグループの@bachiuekiです!
弊社では月に1回社内講習会を開いており、自分はSQL講習を担当しております。
今回はSQLでテーブルを設計する際、文字列を扱うデータ型として必ずと言っていいほど登場するCHAR型とVARCHAR型のお話です。
「なんとなくVARCHARを使っている」「どっちを使えばいいか迷う」という方も多いのではないでしょうか?
この記事では、この2つの型の違いと、それぞれの適切な使い分けについて分かりやすく解説します。
何が違うのか?
一言で言うと、「確保するデータ容量が固定か、変動するか」が最大の違いです。
- CHAR型: 固定長文字列(指定したサイズ分、常に容量を確保する)
- VARCHAR型: 可変長文字列(実際の文字数に合わせて容量が変わる)
それぞれの特徴を詳しく見ていきましょう。
CHAR型(固定長文字列)とは?
CHAR(n) は、常に n 文字分(またはバイト分)の記憶領域を確保するデータ型です。
※ n が文字数単位かバイト数単位かはRDBMSや設定によって異なります。
例えば、CHAR(10) のカラムに「SQL」という3文字のデータを保存した場合、残りの7文字分には自動的に半角スペース(パディング)が埋められて保存されます。
メリット
- 処理速度が速い: データサイズが常に一定であるため、データベースエンジンがデータの保存位置を計算しやすく、検索や更新のパフォーマンスが高い傾向があります。
- フラグメンテーション(断片化)が起きにくい: データ更新時にサイズが変わらないため、ディスク上の配置が綺麗に保たれます。
デメリット
- ストレージの無駄遣い: 保存する文字数が指定サイズより短い場合でも、最大サイズ分の容量を消費してしまいます。
VARCHAR型(可変長文字列)とは?
VARCHAR(n) は、実際に保存する文字数(+データ長を管理するわずかな領域)だけを消費するデータ型です。
例えば、VARCHAR(10) のカラムに「SQL」という3文字を保存した場合、消費されるのは「3文字分のデータ」と「文字数(3)を記録するための1〜2バイト」のみです。
メリット
- ストレージ効率が良い: 無駄なスペースを使わないため、長さにばらつきのあるデータ(名前、メールアドレス、住所など)を保存するのに最適です。
デメリット
-
パフォーマンスの微小なオーバーヘッド: データの長さを毎回計算・記録する必要があるため、
CHAR型に比べるとわずかに処理コストがかかります(ただし、現代のRDBMSではほとんど気にならないレベルです)。 - 更新時の断片化: 後から文字数が多いデータに更新(UPDATE)された場合、元の領域に収まりきらず、ディスク上でデータが断片化する可能性があります。
CHARとVARCHARの比較まとめ
| 特徴 | CHAR型 | VARCHAR型 |
|---|---|---|
| 長さ | 固定(Fixed-length) | 可変(Variable-length) |
| 余った領域 | スペースで埋められる | 実際のデータ長分のみ使用 |
| ストレージ効率 | 悪い(常に最大サイズを消費) | 良い(実際のデータ分だけ消費) |
| 処理速度 | 速い(計算がシンプル) | 普通(データ長の計算が入る) |
| 更新時の断片化 | 起きにくい | 起きる可能性がある |
ケースごとの使い分け
実際のデータベース設計では、以下のように使い分けるのが一般的です。
CHAR型を使うべきケース
「文字数が常に一定のデータ」に使用します。
-
国コード(例:
JP,US→CHAR(2)) -
郵便番号(例:
1000001→CHAR(7)※ハイフンなしの場合) -
フラグ・ステータス(例:
0,1,Y,N→CHAR(1)) - ハッシュ値(例: MD5やSHA-256などで生成された固定長の文字列)
VARCHAR型を使うべきケース
「文字数が変動するデータ」や「長文になる可能性があるデータ」に使用します。
- 氏名(人によって文字数がバラバラ)
- メールアドレス
- 住所
- 備考・コメント
💡 ワンポイントアドバイス
迷った場合は、基本的にVARCHAR型を選択しておけば、ストレージの無駄を防ぐことができるため無難です。現代のデータベースでは、VARCHARのパフォーマンス低下は極めて小さく最適化されています。
おわりに
いかがでしたでしょうか?
CHAR型とVARCHAR型の違いを理解して、データの性質に合わせた適切なテーブル設計を心がけましょう!
この記事が、SQLを学ぶ皆さんの参考になれば幸いです。
オブジェクティブグループではXの投稿も平日毎日行っています!
IT 関連の小ネタや便利技から、日常のアニメ・ゲーム布教なども幅広く投稿してるので、
ご興味のある方は是非フォロー・いいねをお願いします。