Day2 前半のゴール
「“なんとなくTEXTだけ”から、“型を意識して設計する”に切り替える」
SQLite では、正直こうでしたよね。
TEXT と INTEGER と REAL があればだいたい何とかなる
日付も文字列で入れておけば動く
MySQL に来ると、ここが一気に“ちゃんとする世界”になります。
文字列なら VARCHAR
日付・時刻なら DATETIME
ID は AUTO_INCREMENT
Day2 前半のゴールは、
なぜ MySQL は型を細かく分けるのか
VARCHAR と DATETIME をどう使い分けるのか
AUTO_INCREMENT の意味と使い方
ここを、SQLiteとの違いを意識しながら腹落ちさせることです。
SQLite と MySQL の「型のノリ」の違い
「SQLiteは“ゆるい”、MySQLは“ちゃんと決める”」
まず、ざっくりした感覚の違いから。
SQLite
型はあるけれど、かなりゆるい
INTEGER カラムに文字列を入れても怒られなかったりする
TEXT に何でも突っ込んでおける
MySQL
型は“契約”に近い
INT カラムに文字列を入れようとするとエラーになったりする
文字列・日付・数値をきっちり分ける文化
この違いの背景には、
MySQL は「複数人・長期運用・大量データ」が前提
→ 型をきっちり決めておかないと、後で破綻しやすい
という事情があります。
だからこそ、
Day2 では「型をちゃんと選ぶ」感覚を身につけるのが大事になります。
VARCHAR とは何か
「“最大何文字までの文字列”という約束」
MySQL でよく出てくるのが VARCHAR です。
name VARCHAR(50)
email VARCHAR(255)
SQLこういうやつですね。
意味はシンプルで、
「最大 N 文字までの可変長文字列」
です。
VARCHAR(50) なら「50文字まで」VARCHAR(255) なら「255文字まで」
SQLite の TEXT は「長さを気にしない文字列」でしたが、
MySQL の VARCHAR は「このくらいの長さまでにしておこう」という“枠”を決めます。
例:ユーザー名とメールアドレス
ユーザー名
そんなに長くならない → VARCHAR(50) くらいで十分
メールアドレス
サービスによっては長めになる → VARCHAR(255) がよく使われる
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(255) NOT NULL
);
SQLここで大事なのは、
「なんとなく全部 TEXT」ではなく、
「この項目はだいたいこのくらいの長さだろう」と考える癖
です。
VARCHAR の“長さ”はどう決める?
「厳しすぎず、ゆるすぎず、“現実”を意識する」
初心者がよく悩むのがここです。
VARCHAR(50) でいいのか、VARCHAR(100) にすべきか。
正解は「ケースバイケース」ですが、考え方の軸は持てます。
短くしすぎると
ユーザー名が入りきらない
住所が途中で切れる
長くしすぎると
無駄に大きな枠を確保することになる
「何でも入れていい」感じになって設計が雑になる
現実的には、
ユーザー名・商品名 → 50〜100
メールアドレス → 255
郵便番号 → 固定長(CHAR(8) など)にすることもある
といった感じで、「現実のデータ」をイメージして決めます。
ここでのポイントは、
「型を決めるときに、現実のデータを想像する」
という習慣です。
これはセキュリティ的にも大事で、
「ありえない長さの入力」を最初から受け付けない設計につながります。
DATETIME とは何か
「“いつ”を文字列ではなく“時間として”扱う」
SQLite では、日時をこうしていました。
created_at TEXT -- '2025-05-01 10:00:00' みたいな文字列
SQLMySQL では、日時専用の型があります。
代表的なのが DATETIME です。
created_at DATETIME NOT NULL
SQL意味は、
「日付+時刻をセットで持つ型」
です。
例:注文テーブルの日時
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
ordered_at DATETIME NOT NULL
);
SQLここで ordered_at を DATETIME にしておくと、
あとで「日付だけ」「時間だけ」「範囲」などで扱いやすくなります。
DATETIME を使うメリット
「“時間として”比較・集計できる」
日時を TEXT で持つのと、DATETIME で持つのでは、何が違うか。
一番大きいのは、
「時間として正しく比較・集計できるか」
です。
例えば、「2025年5月の注文だけ欲しい」とします。
DATETIME ならこう書けます。
SELECT *
FROM orders
WHERE ordered_at >= '2025-05-01 00:00:00'
AND ordered_at < '2025-06-01 00:00:00';
SQLこれは SQLite でも同じように書けましたが、
MySQL の DATETIME は「中身がちゃんと日時」として扱われるので、
日付部分だけ取り出す(DATE(ordered_at))
時間部分だけ取り出す(TIME(ordered_at))
タイムゾーンを意識した変換
など、時間ならではの操作がしやすくなります。
「日時は文字列じゃなくて“時間として”扱う」
この感覚が、MySQL ではかなり重要です。
DATETIME と TIMESTAMP のざっくり違い
「Day2では“まずはDATETIMEでOK”と覚えておく」
MySQL には TIMESTAMP という型もあります。
細かく言うと、
TIMESTAMP
タイムゾーンや「1970年からの秒数」との変換に強い
自動で現在時刻が入る設定(DEFAULT CURRENT_TIMESTAMP)と相性がいい
DATETIME
「カレンダー上の日付+時刻」をそのまま持つイメージ
タイムゾーン変換は自分で考える
ただ、Day2 の段階では、
「まずは DATETIME を使っておけばOK」くらいで大丈夫です。
後で「更新日時だけ TIMESTAMP にして、自動更新させる」
みたいなテクニックに進めば十分です。
AUTO_INCREMENT の役割
「“IDを自分で数えない”ための仕組み」
SQLite では、こう書きました。
id INTEGER PRIMARY KEY
SQLこれだけで、自動的に 1,2,3,… と増えていきましたね。
MySQL では、こう書きます。
id INT AUTO_INCREMENT PRIMARY KEY
SQLAUTO_INCREMENT がキーワードです。
意味は、
「新しい行を INSERT するとき、
このカラムに自動で連番を振ってくれ」
です。
例:ユーザーテーブル
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(255) NOT NULL
);
SQLINSERT するときは、id を書きません。
INSERT INTO users (name, email)
VALUES ('山田太郎', 'taro@example.com');
SQLすると、MySQL が勝手に id = 1 を入れてくれます。
2件目を入れれば id = 2、という具合です。
なぜ AUTO_INCREMENT が大事なのか
「“意味のある値”をIDにしないため」
初心者がやりがちなのが、
メールアドレスを主キーにする
会員番号を自分で決めて入れる
といった設計です。
一見便利そうですが、
セキュリティ的にも運用的にもリスクが高いです。
メールアドレスが変わったら?
会員番号のルールを変えたくなったら?
推測されやすいIDになっていないか?
AUTO_INCREMENT の「ただの連番ID」を主キーにしておけば、
アプリ側の都合で変わる値(メールアドレスなど)
ユーザーに見せるID(会員番号など)
と、「内部のID」を分離できます。
これは、
情報漏えい時の影響を減らしたり、
将来の仕様変更に耐えたりするうえで、とても大事な設計です。
Day2 前半のまとめ
SQLite は型に対してかなり“ゆるい”が、MySQL は「文字列ならVARCHAR」「日時ならDATETIME」のように、型をきっちり決める文化があり、長期運用・複数人開発・大量データを前提にしている。
VARCHAR は「最大N文字までの可変長文字列」で、ユーザー名やメールアドレスなどに使う。長さを決めるときは「現実のデータ」をイメージし、短すぎても長すぎても困るので、50〜100、255といった現実的な値を選ぶ感覚が大事になる。
DATETIME は「日付+時刻」をセットで持つ型で、文字列としてではなく“時間として”比較・集計できる。期間指定や日別集計など、時間軸のクエリを書くときに威力を発揮する。
AUTO_INCREMENT は「IDを自動で連番にしてくれる仕組み」で、INT AUTO_INCREMENT PRIMARY KEY としておくことで、「内部用のID」と「メールアドレスや会員番号などの意味のある値」を分離でき、セキュリティや将来の仕様変更に強い設計になる。
後半では、
実際に VARCHAR / DATETIME / AUTO_INCREMENT を使ったテーブルをいくつか作り、
INSERT・SELECT を通して「型の違いがどう効いてくるか」を体で確かめつつ、
エンジン(InnoDB)という MySQL 特有の概念にも踏み込んでいきます。
