MySQL の文字列型を使い分ける
MySQL で文字列を扱う型は複数ありますが、実務で特に重要なのは CHAR、VARCHAR、TEXT の3つです。それぞれ特性が異なるため、格納するデータの性質に合わせて選ぶ必要があります。
CHAR と VARCHAR の違い
CHAR は固定長、VARCHAR は可変長という点が最大の違いです。
常に宣言した長さ分のストレージを確保します。CHAR(10) に「ABC」を入れると、残り7文字分がスペースで埋められます。長さが一定のデータに適しています。
実際のデータ長+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)も用意されています。ブログ本文や商品説明のような長文データに使います。
数百文字以上になる可能性がある自由入力欄、HTML コンテンツ、ログメッセージなど。VARCHAR の最大長(65,535バイト、行全体の制限あり)に収まらない場合に選択します。
短い文字列で検索やソートの対象になるカラム。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つの問いに答えることで、自然と適切な型が決まります。



