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を確認します。想定外の照合順序は既存定義を調べ、文字化けはファイル、通信と列の設定を分けて調べます。データベースの既定値を変更しても、既存の文字列列が変換されるとは限りません。元の定義を保存してから必要な変換を検討します。




