結論:MySQLとは表形式で保存し検索できるデータベースです
MySQLとは、表形式でデータを保存し、PHPなどから検索・追加・更新できるリレーショナルデータベースです。ブログ記事・会員・商品・予約などの裏側を担い、WordPressの保存先としても使われます。
HTMLが文書そのもの、PHPとはが文書を作る厨房だとすれば、MySQLは「食材倉庫と検索係」です。厨房のPHPが倉庫から材料(記事・会員データ)を取り出して料理(HTML)を作るイメージです。この記事では全体像、用語、基本SQL、MariaDBとの関係、文字コード、PHP・WordPressとのつながりまで整理します。私たちはMySQL公式ドキュメントとMariaDB公式ドキュメント、PHP公式マニュアル(php.net)を参考にまとめました。
全体像:ブラウザ・PHP・MySQLの分担
Web表示の裏側は3者の分担で動きます。ブラウザが表示、PHPが処理と生成、MySQLが保存と検索です。
- ブラウザが一覧ページ(例:
list.php)を要求する - PHPがMySQLへSQL(例:
SELECT ... LIMIT 20)を送る - MySQLが該当行を返却する
- PHPが結果をループでHTML化する
- ブラウザが完成HTMLを表示する
たとえば掲示板の投稿は、PHPが受け取った本文を INSERT で保存し、一覧表示では SELECT で取り出します。会員ログインでは SELECT で照合し、予約変更では UPDATE、退会や削除では DELETE を使います。通信の往復自体はHTTPの基礎解説、置き場所の考え方はWebサーバー解説で補えます。
- ブラウザ:表示と入力送信(記事一覧の表示、投稿フォームの送信)
- PHP:条件分岐とSQL実行、HTML生成(
list.php、bbs-post.php、login.php) - MySQL:保存・検索・更新・削除(
blog_db内のpostsテーブル)
DB・テーブル・行・SQLの関係:倉庫と表と指示言語
初心者が混同しやすい4用語を整理します。データベースは倉庫全体、テーブルは表1枚、行は1件、列は項目、SQLは指示言語です。
| 用語 | 役割 | 具体例 |
|---|---|---|
| データベース | 倉庫全体 | blog_db、shop_db |
| テーブル | 表1枚 | posts(記事表)、users(会員表) |
| 行(レコード) | データ1件 | 1行=記事1件 |
| 列(カラム) | 項目 | id、title、created_at |
| SQL | 指示言語 | SELECT で取り出し |
具体的な中身を想像します。posts テーブルに列 id、title、body、created_at がある場合、1行が記事1件です。users テーブルなら id、name、email、password_hash のように会員1人が1行です。テーブルを分ける理由は、記事と会員を同じ表に混ぜると検索・更新が複雑になり、誤更新の原因になるためです。用途別に表を分け、必要に応じてIDで関連付けます。
命名の約束は3つです。DB名・テーブル名・列名は半角英数字とアンダースコアに統一し、日本語や空白を避けます。接頭辞が付く環境では作成後の正式名をコピーして使います。予約語(order、group など)を列名に使うとSQLエラーの元になるため避けます。作成手順自体はDB作成手順で扱います。
基本SQL:SELECT・INSERT・UPDATE・DELETEの4命令
覚えるSQLは最初は4つで十分です。取り出し・追加・更新・削除です。次の見本は posts テーブル(id、title)を前提にしています。
-- 取り出し:新しい順に10件
SELECT id, title FROM posts ORDER BY id DESC LIMIT 10;
-- 追加:1件登録
INSERT INTO posts (title) VALUES ('初投稿');
-- 更新:id=1の題名を修正
UPDATE posts SET title = '修正後の題名' WHERE id = 1;
-- 削除:id=1を削除
DELETE FROM posts WHERE id = 1;
UPDATE と DELETE では WHERE を付け忘れると全件対象になるため、実行前に SELECT ... WHERE で対象件数を確認する習慣が重要です。管理画面のSQL実行欄で試す場合も、本番DBではなく確認用DBで試し、件数表示を見てから実行します。
テーブル定義の最小例も示します。文字セットは utf8mb4、エンジンは InnoDB が基準です。
CREATE TABLE IF NOT EXISTS posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
body TEXT,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
VARCHAR(200) は題名のような短文、TEXT は本文のような長文、DATETIME は投稿日時、AUTO_INCREMENT は自動採番のIDです。PHPからの実行は値を直接埋め込まず、PDOのプレースホルダで渡します(PHPとMySQL接続)。文字列結合でSQLを組み立てるとSQLインジェクションの原因になります。
MySQLとMariaDB・他方式との違い:比較表で整理する
MariaDBはMySQL派生の互換性の高いデータベースです。入門段階の基本操作は共通点が多く、区別より基本の習得が優先です。差分は公式ドキュメントで確認するのが確実です。
| 観点 | MySQL | MariaDB |
|---|---|---|
| 位置づけ | 広く使われるRDB | MySQL派生の互換性の高いRDB |
| 基本SQL | SELECT・INSERT等の書き方は共通 | 同左(基本は共通) |
| 入門学習 | テーブル設計と基本SQLから始める | 同左 |
| 確認先 | MySQL公式ドキュメント | MariaDB公式ドキュメント |
FreeHostBoxではMySQL 8 / MariaDB 11.4をご用意しています。どちらが提供されるかや個数・上限はプランと管理画面の表示で確認してください。ぜひ無料プランでお試しください。管理画面の表示に従って進めてください。
保存方式全体の中での位置づけも整理します。
| 方式 | 向く用途 | 注意点 |
|---|---|---|
| MySQL/MariaDB | 記事・会員・商品・予約の管理 | DB・ユーザー作成と権限設定が必要 |
| SQLite等のファイル型DB | 小規模・個人用の試作 | 同時更新や権限管理ではRDB運用が有利 |
| 表計算・CSV直書き | 少量データの手管理 | 検索・同時更新・自動処理はデータベースが得意 |
紹介ページだけならHTML公開の範囲で足りますが、一覧・検索・会員管理が必要になった段階でMySQLの出番です。完成形の例としてWordPressはPHP+MySQL構成で、記事投稿がDB保存、表示がPHPの取り出しとHTML化です。
文字コードとデータ型の基礎:文字化け防止の統一ルール
文字化けの原因は4か所の不一致です。テーブル文字セット、接続文字コード、PHP保存形式、HTMLの meta charset です。4点をUTF-8系に統一します。
| 箇所 | 設定値 | 確認方法 |
|---|---|---|
| テーブル文字セット | utf8mb4 | SHOW CREATE TABLE posts; で確認する |
| 接続文字コード | charset=utf8mb4 | PDO接続文字列で指定する |
| PHP保存形式 | UTF-8(BOMなし) | エディタの表示で確認する |
| HTML表示 | <meta charset=UTF-8> | ソース表示で確認する |
データ型の選び方は次の通りです。題名は VARCHAR(200)、本文は TEXT、IDは INT AUTO_INCREMENT PRIMARY KEY、日時は DATETIME DEFAULT CURRENT_TIMESTAMP が出発点です。メールアドレスは VARCHAR(255)、公開可否は TINYINT(1) のように用途で分けます。桁数や型の厳密な仕様はMySQL公式ドキュメントを参照します。
照合順序(collation)は utf8mb4_0900_ai_ci 等の utf8mb4 系を選びます。絵文字を含む題名や multibyte 文字の検索で差が出ます。既存テーブルの文字セット変更はデータ退避が必要な場合があるため、新規作成時に DEFAULT CHARSET=utf8mb4 を付けるのが確実です。PHP側の接続例はPHPとMySQL接続でご紹介しています。
PHP・WordPressとの関係と安全な使い方の入口
PHPとMySQLの連携は、ホスト名・DB名・ユーザー・パスワードの4情報をPDOに渡し、SQLを実行して結果を htmlspecialchars で表示する流れです。値渡しはプレースホルダが基準です。
$stmt = $pdo->prepare('SELECT id, title FROM posts WHERE title LIKE :q ORDER BY id DESC LIMIT 20');
$stmt->execute([':q' => '%' . $search . '%']);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
WordPressも同じ構成で動きます。記事投稿でDBへ INSERT、表示で SELECT、編集で UPDATE です。仕組みが分かると、表示崩れがテーマ(PHP)の問題か、保存内容(DB)の問題かの切り分けができます。自作の list.php で一覧表示を体験してからWordPressを見ると理解が早くなります。
警告:DBパスワードや管理者情報をソースコードへ直書きしたまま、公開リポジトリへpushしたり共有したりしないでください。接続例の仮値は実際の値に置き換えた上で、ファイルの公開範囲と権限、保管場所を確認します。エラー詳細を本番画面に出しっぱなしにしない点も重要です。
よくある誤解は3つです。「身内掲示板だから対策不要」は誤りで、自動巡回は限定公開でも届きます。「Excelで十分」は少量管理では正しいですが、検索・同時更新・自動処理ではDBが有利です。「DBを作れば自動で表示される」も誤りで、表示はPHP側の取り出しとHTML化が必要です。特に削除系のSQLは実行前の対象確認が不可欠で、条件なし実行による全件消失を防ぐ習慣が求められます。
公開前のチェックリストは次の通りです。
- DB・テーブル・列の用語と役割を説明できる
- SELECT・INSERT・UPDATE・DELETEの4命令を
postsで試した - テーブルと接続が
utf8mb4に統一されている -
UPDATE・DELETE実行前にSELECT ... WHEREで対象件数を確認した - PHP連携ではPDO+プレースホルダ、表示では
htmlspecialcharsを使う方針にした - 秘密情報を公開場所や共有リポジトリに置いていない
- 公式ドキュメントと管理画面の案内表示で最新仕様を確認した
ミニ実践として、今日は posts テーブル作成と4命令の実行までを目標にします。できたら SELECT ... ORDER BY id DESC LIMIT 10 で一覧を取り出し、次記事の作成手順と接続記事へ進みます。サイト全体の工程はサイト公開の全体工程記事も参考になります。作業メモにはDB名・テーブル名・実行したSQL・返却件数を残します。件数が想定と違う場合はSQLを変える前に、対象DBの選択と WHERE 条件の綴りを見直します。更新・削除の前後で対象行の表示を比べると、意図通りの変更かが確かめられます。
補足:命名規則と確認用SQLの使い方
テーブル名と列名は半角英小文字とアンダースコアに統一します。PostTitles のような大文字混じりや日本語名は、環境差や引用符の要否で混乱の元になります。複数語は blog_posts、created_at のように単語間をアンダースコアでつなぎます。列名に order や group などの予約語を使うと、毎回引用符が必要になり保守性が下がるため避けます。新規作成時は SHOW TABLES; で一覧確認し、SHOW CREATE TABLE posts; で文字セットとエンジンを確認する習慣を付けます。
確認用SQLは対象件数を絞って実行します。SELECT * FROM posts; の全件取得ではなく、SELECT id, title FROM posts ORDER BY id DESC LIMIT 10; のように列と件数を限定します。更新前は SELECT id, title FROM posts WHERE id = 1; で対象1件を確認し、更新後に同じ条件で再確認します。削除前も同様に対象行だけを表示してから実行します。件数把握には SELECT COUNT(*) FROM posts; を使います。管理画面のSQL実行欄では対象DBの選択間違いが起きやすいため、実行前に画面上部のDB名表示を見直します。取得結果を画面に出す際はPHP側で出力の無害化を行い、件数表示の前後比較で変更の有無を確かめます。
次に読む記事
- DB作成手順 — DB・ユーザー作成と4情報を揃える手順
- PHPとMySQL接続 — PDOとプレースホルダで一覧表示する実践
- PHPとは — 厨房役のPHP側の仕組み復習
- WordPressとは — PHP+MySQLの完成形の全体像
- サイトの作り方 — 公開までの全体工程の確認
出典・参考資料
- MySQL公式ドキュメント:SQL構文、データ型、文字セット(
utf8mb4)の仕様 - MariaDB公式ドキュメント:互換性と差分の考え方
- PHP公式マニュアル(php.net):PDOと出力エスケープの仕様
- 無料プランの内容は料金ページをご覧ください。分からなければ私たちがサポートします。まずは無料プランで実際に触って確かめてみてください。
よくある質問
データベースはなぜ必要?
記事・会員・商品など保存と検索が必要なデータを扱うためです。紹介ページだけならHTMLのみで足りますが、一覧・検索・会員管理が要る段階でDBが必要です。
MySQLとMariaDBの違いは?
MariaDBはMySQL派生の互換性の高いDBです。基本操作やSQLは共通点が多く、入門段階では区別よりテーブル設計と基本SQLの習得が重要です。公式ドキュメントで差分を確認します。
SQLとは?
DBへ指示する言語です。SELECT(取り出し)・INSERT(追加)・UPDATE(更新)・DELETE(削除)の4つから覚えます。具体例は本文のSQL見本で解説します。
Excelと何が違うの?
表で扱う点は似ていますが、DBは大量件数の検索・同時更新・権限管理・PHPからの自動処理に強い点が違います。掲示板や会員管理のようなWeb処理にはDBが向きます。
無料サーバーでもMySQLは使える?
FreeHostBoxではMySQL 8/MariaDB 11.4をご用意しています。個数や上限はプランで変わるため、管理画面の表示と料金ページで確認してください。ぜひ無料プランでお試しください。
文字化けを防ぐには?
テーブル文字セットと接続文字コードをutf8mb4に統一し、PHP側の保存形式とHTMLのmeta指定もUTF-8に揃えます。絵文字や multibyte 文字を扱う場合は特に重要です。
DBを作ってPHPとつなげる
DB作成からPHP接続まで通して試すと一気に理解が進みます。