1.

MariaDB/MySQL CREATE DATABASE|既存DB・既定値と確認

MariaDB/MySQLのCREATE DATABASEで、新しいDBを作る操作と、既存DBの確認・既定値変更・データ変換・削除を分けて説明します。元の書式付き構文/例と既存のMySQL教材も残し、製品差や破壊的操作の条件を補っています。

IF NOT EXISTSは既存属性を変えず、DB既定変更後も既存列は残る図

作成前に製品と対象を確認する

以下は新しく用意したローカル検体専用です。本番DBや他人のDBへ試すための例ではありません。既に存在するDBを上書き/削除して接続を直すのではなく、接続先・DB名・必要権限と既定値を確認します。

-- Read only. Confirm the product, account and intended local fixture first.
SELECT VERSION() AS server_version, CURRENT_USER() AS authenticated_account,
       DATABASE() AS selected_database, @@character_set_server AS server_charset,
       @@collation_server AS server_collation, @@lower_case_table_names AS name_mode;

新しいDBを明示した属性で作る

次は存在しない専用検体名でだけ実行した例です。utf8mb4_unicode_ciを両製品の検査用に明示しており、全用途の最適な照合順序という意味ではありません。文字の等価性/並び/UNIQUE/末尾空白/版間互換を要件ごとに調べます。アプリ用アカウントへCREATE/ALLを自動付与する手順ではありません。

-- New disposable fixture only. Not a universal recommended collation.
CREATE DATABASE cwiki_w22_new CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Metadata for this owned fixture only; visibility depends on privileges.
SHOW CREATE DATABASE cwiki_w22_new;
SELECT schema_name, default_character_set_name, default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'cwiki_w22_new';

IF NOT EXISTSは既存設定を揃えない

次のcwiki_w22_existingは、latin1/latin1_swedish_ciのDBと1行の表をあらかじめ作った検体です。両製品で1007の警告となり、既存DBの属性とデータはそのまま残りました。「エラーにならない」だけで要求した属性へ揃った/移行できたとは判断しません。

-- The fixture DB already exists. This does not convert its defaults or data.
CREATE DATABASE IF NOT EXISTS cwiki_w22_existing
    CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SHOW WARNINGS;

MariaDBにはOR REPLACEもありますが、これはIF NOT EXISTSの安全な言換えではありません。新しい使い捨て検体では、再作成により元の表が失われました。同じ構文をMySQL8.4.13へ与える検査は1064で拒否されました。エラー回避のために既存DBへ追加しないでください。

DBの既定変更は既存列の変換ではない

次は専用検体のDB既定だけを変更する例です。この後に作った表の列はutf8mb4を継承しましたが、既存表の列はlatin1のままで、元の行も残りました。ALTER TABLEによるデータ変換とは別で、実データへの変換・索引/UNIQUE/外部キー/復旧の検査は今回の例では行っていません。

-- Changes only the default of a new owned fixture; not existing columns.
ALTER DATABASE cwiki_w22_existing
    CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

検体のサーバー既定はMySQLがutf8mb4_0900_ai_ci、MariaDBがutf8mb4_uca1400_ai_ciでした。また両方で0900という照合順序名が存在しました。名前の有無だけで両製品の比較規則/重み/互換まで等しいとは扱わず、古い「MariaDBでは必ず使えない」という一般化もしません。実版と定義/比較結果を確認します。

削除・dump・import・Laravel操作は別作業

CREATE DATABASEとDROP DATABASEは今回の両検体でROLLBACKの取消対象になりませんでした。バックアップのコマンドを1回実行しただけで、必要範囲を保護し復元できると保証しません。dumpには機密データも含まれ得ます。出力先/権限/整合した取得・終了結果/必要なルーチンやイベント/別環境への復元確認を計画し、既存DBへimportしたりSQL中のUSE/DDLを未確認で流したりしません。

migrate、db:wipe、migrate:freshは接続確認やDB名作成の一連の操作ではありません。CWikiではmigrateを実行せず、本記事の検査でもLaravelのschema変更を使っていません。既存my.cnfの変更/サービス再起動、root/広いGRANT/%追加や通常のアカウント管理後のFLUSHも自動対処にしません。

書式付きの元構文と既存の比較教材

以下は元の構文/確認例と、その後の教材です。誤った非コードのセルは直接訂正し、危険な旧コードは直前の注意付きで保持しています。公開例のパスワードは実運用へ使わないでください。

MariaDBのデータベース新規作成SQLです。

 

構文

※ []は任意

元例の注意:日本語と角括弧は構文の説明です。実DB名/製品/権限を確認し、存在確認なしのCREATEを既存環境へ試しません。

CREATE DATABASE データベース名 [CHARACTER SET 文字コード];

 

文字コードの確認コマンド

元例の注意:元のSHOW CREATE DATABASEは指定したDB定義の確認です。置換箇所/空白を確認し、実行権限と対象を照合します。

SHOW CREATE DATABASE データベース名

 

 

元例の注意:角括弧/日本語は任意指定と置換箇所を示す構文です。全指定を文字どおり実行するSQLではありません。

CREATE DATABASE [IF NOT EXISTS] データベース名
  [DEFAULT CHARACTER SET 文字コード]
  [DEFAULT COLLATE 照合順序];

元例の注意:元の照合順序/名前は例で、全用途の推奨ではありません。既存DBへ上書きや再作成をしません。

CREATE DATABASE myapp
  DEFAULT CHARACTER SET utf8mb4
  DEFAULT COLLATE utf8mb4_unicode_ci;

元例の注意:元のmyappは検体名の例で、意図したDBへ置き換えて権限/対象を確認します。

SHOW CREATE DATABASE myapp;

元例の注意:指定schemaの既定値を読む例で、既存の全列が同じ属性という証明ではありません。

SELECT schema_name, default_character_set_name, default_collation_name
  FROM information_schema.schemata
 WHERE schema_name = 'myapp';

元例の注意:IF NOT EXISTSは既存属性を揃える保証ではありません。対象版/設定の実値を別に読みます。

オプション意味備考
IF NOT EXISTS同名の DB があってもエラーにしない作成済みの判定だけで、既存属性との一致は保証しない
CHARACTER SET既定文字コード多くの場面で utf8mb4
COLLATE照合順序 (大文字小文字・全半角等の比較ルール)製品/版/設定の既定を確認。MariaDBをunicode_ci固定と扱わない

元例の注意:旧選定表は万能推奨ではありません。性能/互換性と大小/幅/末尾空白等を実際の要件で確認します。

選定理由
CHARACTER SET utf8mb4絵文字を含む 4 バイト文字 (一部の漢字含む) を正しく保存できる
COLLATE utf8mb4_0900_ai_ci (MySQL 8.0+)MySQLのUCA9.0系の名前。最新Unicodeや両製品の比較結果の一致を意味しない
COLLATE utf8mb4_unicode_ci従来から広く使われ、MariaDB でも利用可
COLLATE utf8mb4_bin比較規則/末尾空白等を要件ごとに検査し、文字列の完全一致を一律保証しない

元例の注意:削除と属性変更を含む旧列を一括実行しません。DROP後にALTERして元へ戻る手順でもありません。

-- 一覧表示
SHOW DATABASES;

-- 削除 (存在しない場合エラーを抑制)
DROP DATABASE IF EXISTS myapp;

-- 文字コード変更
ALTER DATABASE myapp
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

元例の注意:公開された仮の秘密値/%/権限の例です。不要なCRUDをまとめて付けず、FLUSHを通常手順にしません。

CREATE USER 'app'@'%' IDENTIFIED BY '***';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app'@'%';
FLUSH PRIVILEGES;

補足:既存の作成・管理例

旧例の注意:作成と削除/権限/移行/schema変更を分ける要約へ訂正しました。照合順序/GRANT ALL/FLUSH/migrateを一律に組み合わせません。

この記事の要点
  • CREATE DATABASE mydb; が基本。文字コード/照合順序は製品・版・比較要件で明示して確認
  • 一覧表示は SHOW DATABASES;、削除は DROP DATABASE mydb; (ROLLBACKで取り消せない破壊的操作)
  • ユーザーと作成権限/必要な表操作を別に設計。GRANT ALL/%追加/通常のFLUSHへ自動的に進まない
  • インポート: mysql -u user -p mydb < dump.sql。GUI は phpMyAdmin / MySQL Workbench
  • Laravelの接続設定/DB作成/schema変更は別の作業。接続確認でmigrateを実行しない

基本: CREATE DATABASE

旧例の注意:最小形と属性指定は代替例で同名への連続実行を推奨しません。IF NOT EXISTSで既存DBの属性が揃うわけではありません。

-- 最小形
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 バイト) や一部漢字を保存できません。Unicode文字を扱う要件と対象製品のcharsetを確認します。MySQLのutf8略記を全MariaDB版へ無条件に適用しません。

旧例の注意:文字コードの概要で、接続/既存列/実データを一括変換する命令ではありません。MariaDBのutf8別名は対象版/設定を確認します。

charsetバイト数絵文字用途
utf8 (= utf8mb3)1〜3NG★ 非推奨。古い DB のみ
utf8mb41〜4OK★★★ 推奨
latin11NGレガシー欧文のみ

旧例の注意:名前だけで性能/Unicodeの新しさ/版間互換を保証しません。等価性/並び/末尾空白等を実要件で検査します。

collation意味
utf8mb4_general_ci旧来の比較規則。速度/一致要件を実測し、全言語で不正確と一律に判断しない
utf8mb4_unicode_ci検査例でも使った照合順序。全用途の万能推奨ではない
utf8mb4_unicode_520_ciより新しい Unicode 5.2.0 ベース
utf8mb4_0900_ai_ciMySQL8.4検体の既定はこの名前。UCA9.0系で、最新Unicodeという意味ではない
utf8mb4_binバイナリ比較。大文字小文字を区別

DROP DATABASE — ROLLBACKでは戻せない

旧例の注意:DROPとshellのmysqldumpが混在する破壊的な旧例で、一括実行しません。dump成功と復元可能性/停止時点は別に確認し、ROLLBACKで削除を戻せると扱いません。

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

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

ユーザー作成と権限付与

旧例の注意:公開パスワード/%/広いGRANTを既存環境へ追加せず、実行用と変更用の権限を分けます。通常のCREATE USER/GRANT後のFLUSHは不要です。

-- 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'@'%';

権限の代表的なもの

旧例の注意:権限レベル/対象により範囲が異なります。ALLを全server権限やGRANT OPTION込みの意味にしません。

権限意味
SELECTSELECT 文の実行
INSERTINSERT 文の実行
UPDATEUPDATE 文の実行
DELETEDELETE 文の実行
CREATE / DROPテーブル等の作成/削除
ALTERテーブル定義変更
INDEXインデックス作成/削除
EXECUTEストアドプロシージャ実行
ALL PRIVILEGES指定した権限レベルで該当する権限。全server権限やGRANT OPTIONを無条件に含む意味ではない
GRANT OPTION他ユーザーに権限を与える権利

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

旧例の注意:root/全DB/pipe直結を既存環境の通常手順にしません。機密・一貫性・終了コード/取得範囲と復元を確認し、SQL中のUSE/DDLも未確認で流しません。実backup/importは今回未検証です。

# エクスポート
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 ツール

旧例の注意:既存ツール名の参考表です。対応版/OS/edition/配布・利用条件を公式に調べ、全サービスの標準導入や無条件無料/最良UIと判断しません。

ツール特徴
phpMyAdminWebブラウザベース。全レンタルサーバーの標準導入とは限らない
MySQL Workbench公式デスクトップ。ER 図、モデリング、管理
DBeaverマルチDB対応。対象edition/配布条件は別に確認
HeidiSQLWindows 軽量
Sequel Ace (Mac)Sequel Pro 後継、Mac 専用
TablePlus対象OS/必要機能/利用条件を公式に確認。UIの優劣を一律評価しない

information_schema で情報取得

旧例の注意:見える情報は権限等に依存します。InnoDBのtable_rows/サイズ等の概算を実件数/backup必要容量と同一視せず、全DB情報を公開しません。

-- 全 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 作成 / マイグレーション

旧例の注意:Laravel固有の旧例で、SQL shellへ貼り付けません。migrate/db:wipe/migrate:freshはschema/データへ影響する別作業です。CWikiではmigrateを実行せず、接続試験のための全削除/初期化もしません。

# .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

旧例の注意:Laravel migrationの定義例で、新DB作成/接続確認とは別です。既存users表へ実行せず、downが任意のデータを元通りに復元する保証とも扱いません。

<?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 のデフォルト設定

旧例の注意:既存my.cnfへの追記やサービス再起動を推奨しません。server/client/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 指定省略可

よくあるエラー

旧例の注意:旧設定/191固定/広いGRANTや一括変換を自動対処にしないよう訂正しました。エラー番号だけで原因と変更を確定しません。

エラー原因対処
ERROR 1007 (HY000): Can't create database; exists既存 DB既存DBの対象/属性を確認。IF NOT EXISTSは属性の一致や変換を保証しない
ERROR 1044 (42000): Access denied権限不足対象/必要権限を承認された管理者が確認。root/全権限へ自動的に切り替えない
4 バイト文字で Incorrect string valueutf8 (mb3)実データ・接続/列型/charsetを確認。一括変換は別途設計/復旧検証
ERROR 1071: Specified key was too longInnoDB の VARCHAR(255) インデックス × utf8mb4版/行形式/索引列/ページ設定等を確認。旧innodb_large_prefixや191固定を現行の万能対処にしない

FAQ

Q: utf8 で作った既存 DB を utf8mb4 に変換できる?
A: DBの既定変更と既存表/列のデータ変換は別です。ALTER DATABASEだけでは既存列は変わりません。実データ/索引/UNIQUE/外部キー/停止影響と復元を調べ、一括変換の実行手順として流用しません。

Q: 命名規則は?
A: 識別子規則、lower_case_table_names/ファイルシステム/対象版と移行先を確認します。Linux/Windowsという名前だけで全構成の挙動を決めず、既存の名前を一括変更しません。

Q: DB を別サーバへ移行したい
A: データ量だけで方式を決めず、一貫性/停止条件/対応版/対象範囲/権限/復元・切替と戻し方を計画します。dumpのpipe直結やreplica昇格を自動的な移行手順にしません。

確認範囲と関連ページ

2026年10月26日確認。掲載した新7SQLは独立したMySQL8.4.13/MariaDB11.8.9の新規tmpfs検体で実行しました。既存DBのIF NOT EXISTSと警告、既定変更と既存列、CREATE/DROPのROLLBACK不可、InnoDB検体のCOMMIT/ROLLBACK、読取権限とCREATE拒否を確認しています。既存本番DBのDDL/データ/設定/アカウントは変更していません。一般DB比較の全製品、旧全コード、実backup/restore/import/replication、全照合順序の重み/Unicode比較、OS間差や障害耐久性、LaravelのDDLを実行検証したものではありません。

データベース関連の親ページから子ページを選択できます。データベースの作成、MySQL/MariaDB配下のSQL、テーブル関連、同じ製品配下のユーザー関連、MySQL/MariaDBの親ページも参照します。

一次資料:MariaDB CREATE DATABASEとOR REPLACE、MySQL CREATE DATABASE、MySQLのDB既定変更、MariaDBのDB既定変更、InnoDBの分離レベル、MongoDBのトランザクション、ClickHouseの列指向モデル、Cassandraのwide-columnモデル、MyBatisのSQLマッピング。

子ページ

子ページはありません

同階層のページ

同階層のページはありません

最近更新/作成されたページ