MariaDB講座 / CREATE DATABASE・USE・utf8mb4でデータベースを作る

CREATE DATABASEはデータベースを作り、USEは現在の接続で使う既定のデータベースを選びます。実習ではutf8mb4と照合順序を明示し、保存された設定を確認します。IF NOT EXISTSは既存データベースの設定を変更しません。

アカウントと作成範囲を確認する

接続手順に従いcourse_userで接続します。導入時に与えたshopcourse.*の権限はこの領域に限られ、任意のデータベースを作る権限ではありません。講座では名前をshopcourseに統一し、mysqlなどのシステム領域に実習表を作りません。

SELECT CURRENT_USER() AS privilege_account;
SHOW GRANTS;

CURRENT_USER()がcourse_user@127.0.0.1か確認し、SHOW GRANTSで対象範囲を読みます。異なるアカウントなら、接続したユーザーやHost規則が違う可能性があります。名前を独自に変えるなら、権限と後続のSQLをすべて一致させる必要があります。

作成し、保存された定義を調べる

全体をUTF-8のlesson05-create-database.sqlに保存してSOURCEで実行するか、接続中に順番に実行します。

CREATE DATABASE IF NOT EXISTS shopcourse
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

SHOW WARNINGS;
USE shopcourse;
SELECT DATABASE() AS current_database;
SHOW CREATE DATABASE shopcourse;

SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'shopcourse';

新規ならSELECT DATABASE()はshopcourse、SCHEMATAの行はshopcourse、utf8mb4、utf8mb4_unicode_ciになります。SHOW WARNINGSは調べたい文の直後に実行します。SHOW CREATE DATABASEはサーバーに保存された定義を返し、表示の細部は版で違う場合があります。

ここで作るのは表を入れるデータベースです。products表はまだ作っていません。商品表の作成で、この領域にデータを保存します。

IF NOT EXISTSは既存の設定を直さない

同名のデータベースがある場合、IF NOT EXISTSはエラーを避けて既存のものを残し、通知を返します。中身を初期化したり、文字セットや照合順序を書き換えたりしません。再実行が成功しても、希望した設定になった証拠にはならないため、必ず実際の定義を読みます。

結果を例とそろえるためだけにDROP DATABASEしないでください。必要なデータがある場合は保護し、データベース・表・列のどの設定を変更する必要があるかを別々に判断します。

文字セット・照合順序・接続を分ける

設定 役割
文字セット 文字の表現方法。utf8mb4は4バイトのUTF-8文字を扱う
照合順序 文字列の等価比較や並べ替えの規則
データベースの既定値 後から作る表が、指定を省略した場合に引き継ぐ値
表・列の定義 実際に保存する文字列に適用される規則
接続の文字セット クライアントとサーバーが文字を受け渡す規則

utf8という短い名前は、従来の別名や設定の影響を受けるため、ここではutf8mb4を明示します。utf8mb4_unicode_ciは利用しやすい一例で、すべての版で最新・既定という意味ではありません。比較の違いを一つだけ確認します。

SELECT
  _utf8mb4'A' COLLATE utf8mb4_unicode_ci =
  _utf8mb4'a' COLLATE utf8mb4_unicode_ci AS case_insensitive,
  _utf8mb4'A' COLLATE utf8mb4_bin =
  _utf8mb4'a' COLLATE utf8mb4_bin AS binary_comparison;

case_insensitiveは1、binary_comparisonは0になります。このASCIIのAとaでは、前者が等しいと判定し、後者が区別します。これだけであらゆる言語の順序を説明できるわけではありません。必要な検索・比較の条件で選び、列の型は文字列型と合わせて検討します。

USEの適用範囲とよくある問題

接続内で実行します。

USE shopcourse;
SELECT DATABASE() AS current_database;
SHOW TABLES;

USEが変えるのは現在の接続だけで、全クライアントの既定値ではありません。新規作成直後ならSHOW TABLESが空なのは正常です。表ができた後はshopcourse.productsという完全修飾名でも参照でき、productsだけなら選択中のデータベースに依存します。

権限エラーはCURRENT_USER()とSHOW GRANTS、Unknown databaseは接続先・ポート・名前、No database selectedはUSEを確認します。想定外の照合順序は既存定義を調べ、文字化けはファイル、通信と列の設定を分けて調べます。データベースの既定値を変更しても、既存の文字列列が変換されるとは限りません。元の定義を保存してから必要な変換を検討します。

関連する公式リファレンス