タイトル: データベースの作成
SEOタイトル: MySQL データベース作成完全ガイド
| この記事の要点 |
CREATE DATABASE mydb; が基本。文字コードは utf8mb4 + utf8mb4_unicode_ci を推奨- 一覧表示は
SHOW DATABASES;、削除は DROP DATABASE mydb; (★ 復元不可) - ユーザー権限:
CREATE USER → GRANT 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〜3 | NG | ★ 非推奨。古い DB のみ |
| utf8mb4 | 1〜4 | OK | ★★★ 推奨 |
| latin1 | 1 | NG | レガシー欧文のみ |
| collation | 意味 |
| utf8mb4_general_ci | 高速だが旧式。多言語比較で正確でない |
| utf8mb4_unicode_ci | ★ Unicode 標準準拠 (一般推奨) |
| utf8mb4_unicode_520_ci | より新しい Unicode 5.2.0 ベース |
| utf8mb4_0900_ai_ci | MySQL 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'@'%';
権限の代表的なもの
| 権限 | 意味 |
SELECT | SELECT 文の実行 |
INSERT | INSERT 文の実行 |
UPDATE | UPDATE 文の実行 |
DELETE | DELETE 文の実行 |
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 ツール
| ツール | 特徴 |
| phpMyAdmin | Web ブラウザベース。レンタルサーバ標準 |
| MySQL Workbench | 公式デスクトップ。ER 図、モデリング、管理 |
| DBeaver | マルチ DB 対応。無料 |
| HeidiSQL | Windows 軽量 |
| 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
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 | 既存 DB | IF NOT EXISTS |
ERROR 1044 (42000): Access denied | 権限不足 | root で GRANT |
4 バイト文字で Incorrect string value | utf8 (mb3) | utf8mb4 へ変換 |
ERROR 1071: Specified key was too long | InnoDB の 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 レプリケーションを張り、切替時にプライマリ昇格。