MySQL | SQLite経験者向け、30日で習得するMySQL:差分理解 - Day2 SQLiteとの違い

SQL MySQL
スポンサーリンク

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' みたいな文字列
SQL

MySQL では、日時専用の型があります。

代表的なのが 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
SQL

AUTO_INCREMENT がキーワードです。

意味は、

「新しい行を INSERT するとき、
 このカラムに自動で連番を振ってくれ」

です。

例:ユーザーテーブル

CREATE TABLE users (
  id    INT AUTO_INCREMENT PRIMARY KEY,
  name  VARCHAR(50) NOT NULL,
  email VARCHAR(255) NOT NULL
);
SQL

INSERT するときは、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 特有の概念にも踏み込んでいきます。

タイトルとURLをコピーしました