Loading
  • LIGHT

  • DARK

ROUTE

ルートゼロの
アクティビティ

【SQL】CHARとVARCHARの違いとは?「空白が埋まる」「文字が切れる」よくあるつまずきを徹底解説

3

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設計が、今より一段スマートになりますように。

【外部リンク】

MySQL公式ドキュメント:CHAR型

MySQL公式ドキュメント:VARCHAR型

PostgreSQL公式ドキュメント:文字列データ型

【内部リンク】

SQL CASE WHEN 入門から実践まで!初心者もわかる条件分岐クエリの書き方

SQL Syntax Errorの原因と対処チェックリスト|今すぐ試せるエラー解決法

SQL UNIONの使い方をやさしく解説|違い・注意点・活用例まとめ

SQL JOINの基本から実践まで|INNER・LEFT・RIGHT・OUTER JOINの違いをわかりやすく解説

初心者向けSQL講座|SELECT文の書き方と実行順を完全解説

RANKINGranking-icon

LATEST POSTS

もっとルートゼロを知りたいなら

DISCOVER MORE