この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:7
ページ更新者:atom
更新日時:2026-06-11 07:12:00

タイトル: データベースの作成
SEOタイトル: MySQL データベース作成完全ガイド

この記事の要点
  • CREATE DATABASE mydb; が基本。文字コードは utf8mb4 + utf8mb4_unicode_ci を推奨
  • 一覧表示は SHOW DATABASES;、削除は DROP DATABASE mydb; (★ 復元不可)
  • ユーザー権限: CREATE USERGRANT ALL ON mydb.* TO user@"%"FLUSH PRIVILEGES
  • インポート: mysql -u user -p mydb < dump.sql。GUI は phpMyAdmin / MySQL Workbench
  • Laravel は config/database.php + .env + php artisan migrate で管理

基本: CREATE DATABASE

-- 最小形
CREATE DATABASE mydb;

-- ★ 推奨: 文字コードと照合順序を明示
CREATE DATABASE mydb
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;

-- 既存ならスキップ (エラーにしない)
CREATE DATABASE IF NOT EXISTS mydb
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;

-- 確認
SHOW DATABASES;
SHOW CREATE DATABASE mydb;

文字コード: なぜ utf8mb4 か

MySQL の utf8歴史的事情で 3 バイトまでの制限があり、絵文字 (4 バイト) や一部漢字を保存できません。新規 DB は必ず utf8mb4 を選びます。

charsetバイト数絵文字用途
utf8 (= utf8mb3)1〜3NG★ 非推奨。古い DB のみ
utf8mb41〜4OK★★★ 推奨
latin11NGレガシー欧文のみ
collation意味
utf8mb4_general_ci高速だが旧式。多言語比較で正確でない
utf8mb4_unicode_ci★ Unicode 標準準拠 (一般推奨)
utf8mb4_unicode_520_ciより新しい Unicode 5.2.0 ベース
utf8mb4_0900_ai_ciMySQL 8 デフォルト、最新 Unicode 9
utf8mb4_binバイナリ比較。大文字小文字を区別

DROP DATABASE — 削除は復元不可

DROP DATABASE mydb;            -- ★ 即削除、復元不可 (バックアップから戻すしかない)
DROP DATABASE IF EXISTS mydb;  -- 存在しなくてもエラーにしない

-- ★ 本番では必ずバックアップ後に
mysqldump -u root -p mydb > backup_$(date +%Y%m%d).sql
DROP DATABASE mydb;

ユーザー作成と権限付与

-- 1. ユーザー作成 (MySQL 8+ 構文)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'strong_password';

-- 2. 特定 DB のみ権限付与
GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'%';

-- 細かく付与
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'readwrite'@'%';
GRANT SELECT ON mydb.* TO 'readonly'@'%';

-- 3. 反映
FLUSH PRIVILEGES;

-- 4. 確認
SHOW GRANTS FOR 'app_user'@'%';

-- 削除
REVOKE ALL PRIVILEGES ON mydb.* FROM 'app_user'@'%';
DROP USER 'app_user'@'%';

権限の代表的なもの

権限意味
SELECTSELECT 文の実行
INSERTINSERT 文の実行
UPDATEUPDATE 文の実行
DELETEDELETE 文の実行
CREATE / DROPテーブル等の作成/削除
ALTERテーブル定義変更
INDEXインデックス作成/削除
EXECUTEストアドプロシージャ実行
ALL PRIVILEGES上記すべて (GRANT 除く)
GRANT OPTION他ユーザーに権限を与える権利

SQL ダンプのインポート / エクスポート

# エクスポート
mysqldump -u root -p mydb > dump.sql
mysqldump -u root -p mydb table1 table2 > partial.sql      # テーブル単位
mysqldump -u root -p --all-databases > all.sql              # 全 DB
mysqldump -u root -p --no-data mydb > schema.sql            # スキーマのみ
mysqldump -u root -p --routines --triggers mydb > full.sql  # ストアド/トリガー含む

# 圧縮
mysqldump -u root -p mydb | gzip > dump.sql.gz

# インポート (★ DB は事前に作成しておく)
mysql -u root -p mydb < dump.sql
gunzip -c dump.sql.gz | mysql -u root -p mydb

# DB 作成も含むダンプ
mysqldump --databases mydb > dump.sql
# → CREATE DATABASE mydb; USE mydb; ... が含まれる
mysql -u root -p < dump.sql

GUI ツール

ツール特徴
phpMyAdminWeb ブラウザベース。レンタルサーバ標準
MySQL Workbench公式デスクトップ。ER 図、モデリング、管理
DBeaverマルチ DB 対応。無料
HeidiSQLWindows 軽量
Sequel Ace (Mac)Sequel Pro 後継、Mac 専用
TablePlus有料だが UI 優秀

information_schema で情報取得

-- 全 DB の一覧と文字コード
SELECT schema_name, default_character_set_name, default_collation_name
FROM information_schema.SCHEMATA;

-- 特定 DB のテーブル一覧
SELECT table_name, engine, table_rows, data_length
FROM information_schema.TABLES
WHERE table_schema = 'mydb';

-- 特定テーブルのカラム
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.COLUMNS
WHERE table_schema = 'mydb' AND table_name = 'users';

-- DB ごとのサイズ (MB)
SELECT table_schema AS db,
    ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) AS size_mb
FROM information_schema.TABLES
GROUP BY table_schema
ORDER BY size_mb DESC;

Laravel での DB 作成 / マイグレーション

# .env で接続情報設定
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=mydb
DB_USERNAME=app_user
DB_PASSWORD=strong_password

# DB 接続確認
php artisan tinker
>>> DB::connection()->getPdo();

# マイグレーション実行
php artisan migrate

# 全テーブル削除 (★ 危険、ローカルのみ)
php artisan db:wipe

# 全リセット + シーディング
php artisan migrate:fresh --seed

# 個別マイグレーション作成
php artisan make:migration create_users_table
<?php
// database/migrations/YYYY_MM_DD_create_users_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamps();
        });
    }
    public function down(): void
    {
        Schema::dropIfExists('users');
    }
};

my.cnf で DB のデフォルト設定

# /etc/mysql/my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server     = utf8mb4_unicode_ci

# クライアント側
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

# これで CREATE DATABASE 時に CHARACTER SET 指定省略可

よくあるエラー

エラー原因対処
ERROR 1007 (HY000): Can't create database; exists既存 DBIF NOT EXISTS
ERROR 1044 (42000): Access denied権限不足root で GRANT
4 バイト文字で Incorrect string valueutf8 (mb3)utf8mb4 へ変換
ERROR 1071: Specified key was too longInnoDB の VARCHAR(255) インデックス × utf8mb4長さを 191 に / innodb_large_prefix

FAQ

Q: utf8 で作った既存 DB を utf8mb4 に変換できる?
A: ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + 各テーブル ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 ...; で変換可。VARCHAR インデックス長に注意。

Q: 命名規則は?
A: 小文字スネークケース (my_app_db) が無難。MySQL の Linux 環境はテーブル名が大文字小文字区別なので、混在すると Windows と挙動が変わる。

Q: DB を別サーバへ移行したい
A: 小規模なら mysqldump | mysql -h newhost。大規模は MySQL レプリケーションを張り、切替時にプライマリ昇格。