CHARとVARCHARとは? — 基本定義と用途の違い
このセクションで解決できること:
CHARとVARCHARの定義や性質の違いが、初心者にも分かる言葉と構造で理解できます。用途ごとの向き・不向きも合わせて学べます。
「CHARとVARCHARって、結局どう違うの?」
SQLでテーブル設計をしていると、こんな疑問にぶつかったことはありませんか?
同じ文字列を保存しているはずなのに、
-
「余計な空白がついていた」
-
「期待通りに検索ヒットしない」
-
「文字数が足りず切れてしまった」
…というトラブルが起きる原因は、このデータ型の違いにあります。
ここでは、まずCHARとVARCHARがどういう型なのか、基本から整理しましょう。
◆ CHAR型とは(固定長)
-
常に指定した長さの固定長文字列
-
足りない分は自動的に空白で埋められる
-
主に「コード」や「決まった長さの ID」など、文字列長が一定のデータに使われる
CREATE TABLE sample_char (
code CHAR(5)
);
INSERT INTO sample_char (code) VALUES ('AB');
→ 実際に保存される値は ‘AB ‘(空白が3つ補完)
◆ VARCHAR型とは(可変長)
-
入力された文字列の長さに応じた可変長文字列
-
無駄な空白は付かない
-
主に「名前」「コメント」など、長さがまちまちなデータに使われる
CREATE TABLE sample_varchar (
name VARCHAR(5)
);
INSERT INTO sample_varchar (name) VALUES ('AB');
→ 実際に保存される値は ‘AB’(空白なし)
◆ まとめ:どちらを使う?
-
長さが決まっているなら → CHAR
-
ばらつきがあるなら → VARCHAR
次のセクションでは、実際にINSERT・SELECTしてみたときの「空白の扱いの違い」「検索時の挙動の違い」を比べてみましょう。
実例で比較!CHARとVARCHARの挙動の違い
このセクションで解決できること:
実際にINSERT・SELECTしてみた結果から、データの格納・表示上の違いが視覚的に分かります。
◆ テーブル作成とデータ挿入
-- CHAR テーブル
CREATE TABLE char_test (
val CHAR(5)
);
-- VARCHAR テーブル
CREATE TABLE varchar_test (
val VARCHAR(5)
);
-- 2文字のデータを挿入
INSERT INTO char_test (val) VALUES ('AB');
INSERT INTO varchar_test (val) VALUES ('AB');
◆ SELECT してみる
SELECT val, LENGTH(val) FROM char_test;
-- 結果: 'AB ', 5
SELECT val, LENGTH(val) FROM varchar_test;
-- 結果: 'AB', 2
→ CHARでは自動的に空白で埋められて5文字になっている
→ VARCHARは入力されたままの長さ
◆ WHERE 句での違い
SELECT * FROM char_test WHERE val = 'AB';
-- → ヒットしない(空白補完と一致しないため)
SELECT * FROM char_test WHERE val = 'AB ';
-- → ヒットする
これは、CHAR型は空白込みで一致を確認するためです。
ストレージ・パフォーマンス・インデックス面での比較
このセクションで解決できること:
ストレージサイズやインデックス作成の影響、パフォーマンスにどう違いが出るか理解できます。
◆ ストレージ使用量
-
CHAR: 常に固定長。5文字なら常に5バイト(+オーバーヘッド)
-
VARCHAR: 入力に応じた長さ + 長さ情報を保持する1〜2バイト
! 少量データなら CHAR の無駄は小さいが、大量・長文だと VARCHAR が圧倒的に効率的。
◆ パフォーマンス面(読み取り速度)
-
CHARは固定長なので比較が高速
-
インデックスもサイズが一定のため内部処理がシンプル
一方で、可変長のVARCHARは処理コストが若干かかります。
◆ UPDATE の影響と断片化
-
VARCHARでは、内容を変更するとページ分割やフラグメンテーションが起きやすい
-
CHARは長さが変わらないため、更新時にデータ配置が安定
実務でどう使い分ける?選定のための判断基準
このセクションで解決できること:
「どっちを選べばよいか」が分からない読者に、判断軸を具体的に提示します。
判断フロー(if-then 型)
-
IF 長さが常に同じ → THEN CHAR
-
IF 長さにばらつき → THEN VARCHAR
-
IF インデックス重視で読み取り最速を優先 → THEN CHAR
-
IF ディスク使用量や柔軟性重視 → THEN VARCHAR
シーン別ベストプラクティス
-
国コード(例:JP, US)→ CHAR(2)
-
郵便番号 → CHAR(7)
-
氏名・ニックネーム → VARCHAR(50)
-
コメント・備考欄 → VARCHAR(255) 以上
よくある誤解とつまずきの解消 Q&A
このセクションで解決できること:
典型的なトラブル・誤解をQ&A形式で明快に解決します。
Q1. CHAR型を使ったらLIKE検索でヒットしない?
A. 空白が末尾に自動追加されるため、LIKE ‘abc%’のような曖昧検索と不一致になることがあります。TRIM()やRTRIM()を使って空白を除去すると解決します。
Q2. VARCHARで定義したのに文字が切れる?
A. 定義した最大長(例:VARCHAR(5))を超えた文字列をINSERTすると自動で切り詰められる、あるいはエラーになります。入力値をチェックしましょう。
Q3. CHAR(1)とVARCHAR(1)はどう違うの?
A. 見た目の違いは少ないですが、固定長のCHAR(1)は読み取り高速&省メモリ。ただし実務上の違いはほぼ誤差なので、コード上の一貫性で選んで構いません。
まとめとおすすめのベストプラクティス
このセクションで解決できること:
理解した内容を一度まとめ、実務判断での活用に繋げます。
✔︎ 要点まとめ
-
CHAR:固定長、空白補完、高速読み取り
-
VARCHAR:可変長、柔軟な長さ、省メモリ
✔︎ 型選択フロー
1. データの長さは固定か? → Yes → CHAR / No → VARCHAR
2. 更新頻度は? → 低ければ CHAR、高ければ VARCHAR
3. 検索・インデックス重視? → CHAR
4. ストレージ効率重視? → VARCHAR
✔︎ これからの設計に活かすために
「なんとなく」ではなく、「こうだからCHAR」「この理由でVARCHAR」という判断を下せるようになれば、SQL設計は格段に安定します。
あなたの選択が、パフォーマンスにも保守性にも繋がります。
おわりに
CHARとVARCHARの違いは、最初はややこしく感じるかもしれません。
でも、実例で体験しながら学ぶことで、確実に使いこなせるようになります。
「空白が入ってしまった」「検索に引っかからない」…そんなつまずきに、もう悩まなくて大丈夫です。
あなたのSQL設計が、今より一段スマートになりますように。
【外部リンク】
【内部リンク】
SQL CASE WHEN 入門から実践まで!初心者もわかる条件分岐クエリの書き方
SQL Syntax Errorの原因と対処チェックリスト|今すぐ試せるエラー解決法
SQL UNIONの使い方をやさしく解説|違い・注意点・活用例まとめ