MySQL の文字列型を使い分ける

MySQL で文字列を扱う型は複数ありますが、実務で特に重要なのは CHAR、VARCHAR、TEXT の3つです。それぞれ特性が異なるため、格納するデータの性質に合わせて選ぶ必要があります。

CHAR と VARCHAR の違い

CHAR は固定長、VARCHAR は可変長という点が最大の違いです。

CHAR(固定長)

常に宣言した長さ分のストレージを確保します。CHAR(10) に「ABC」を入れると、残り7文字分がスペースで埋められます。長さが一定のデータに適しています。

VARCHAR(可変長)

実際のデータ長+1〜2バイトの長さ情報だけを格納します。VARCHAR(100) に「ABC」を入れると、4バイトしか消費しません。長さにばらつきがあるデータに向いています。

CHAR が有利なのは、郵便番号(7桁固定)、国コード(JP, US など2文字固定)、ハッシュ値(SHA-256 なら64文字固定)のように長さが決まっているケースです。固定長のためインデックスの比較処理がわずかに速くなります。

VARCHAR の長さ指定

VARCHAR(255) をデフォルトで使う慣習がありますが、これには注意が必要です。MySQL 内部では、一時テーブルやソート処理の際に宣言した最大長でメモリを確保する場合があります。実データが平均20文字程度なら VARCHAR(50) のように適切な上限を設定しましょう。

-- 悪い例:なんでも255
CREATE TABLE users (
  name VARCHAR(255),
  email VARCHAR(255),
  phone VARCHAR(255)
);

-- 良い例:実際のデータ長に合わせる
CREATE TABLE users (
  name VARCHAR(100),
  email VARCHAR(254),
  phone VARCHAR(20)
);

email を VARCHAR(254) にしているのは、RFC 5321 でメールアドレスの最大長が254文字と定められているためです。

TEXT 型の使いどころ

TEXT 型は最大65,535バイトまで格納でき、さらに MEDIUMTEXT(約1600万バイト)、LONGTEXT(約4GB)も用意されています。ブログ本文や商品説明のような長文データに使います。

TEXT を使うべき場面

数百文字以上になる可能性がある自由入力欄、HTML コンテンツ、ログメッセージなど。VARCHAR の最大長(65,535バイト、行全体の制限あり)に収まらない場合に選択します。

TEXT を避けるべき場面

短い文字列で検索やソートの対象になるカラム。TEXT 型にはデフォルトでインデックスを張れず、プレフィックスインデックスが必要になります。

BINARY と VARBINARY

文字列ではなくバイト列として格納したい場合は BINARY / VARBINARY を使います。UUID をバイナリ形式で格納する場合(BINARY(16))などが代表的な用途で、VARCHAR(36) でハイフン付き文字列として持つより省スペースになります。

-- UUID をバイナリで格納
CREATE TABLE sessions (
  id BINARY(16) PRIMARY KEY,
  user_id INT NOT NULL,
  created_at DATETIME NOT NULL
);

-- 挿入時
INSERT INTO sessions (id, user_id, created_at)
VALUES (UUID_TO_BIN(UUID()), 1, NOW());

文字列型はテーブル設計で最も頻繁に使う型のひとつです。「固定長か可変長か」「最大何文字か」「検索やソートの対象か」という3つの問いに答えることで、自然と適切な型が決まります。