※この記事にはアフィリエイト広告(プロモーション)が含まれます。
MySQL のデータベース一覧は SHOW DATABASES で出ます。MySQL ではデータベースとスキーマは同じもので、SHOW SCHEMAS と書いても結果は変わりません。この記事の出力は MySQL 8.4.11(Ubuntu 26.04 の標準パッケージ)で採りました。
まず見る(結論)
- 一覧:
SHOW DATABASES;。名前で絞るならSHOW DATABASES LIKE 'fsv%'; - 文字コードも見るなら
information_schema.SCHEMATA - 切り替え:
USE データベース名;。今どこにいるかはSELECT DATABASE(); - 一覧に出るのは、そのユーザーが権限を持つデータベースだけ
一覧を出す
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| Fsv3 |
| fsv |
| fsv2 |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
information_schema・mysql・performance_schema・sys の4つは MySQL が使うデータベースで、インストール直後から入っています。自分で作ったものだけを見たいときは WHERE で外します。
SHOW DATABASES WHERE `Database` NOT IN ('mysql','sys','information_schema','performance_schema');
LIKE では大文字と小文字が区別されました。LIKE 'fsv%' では Fsv3 が出ず、LIKE 'Fsv%' で出ます。Linux の MySQL は既定(lower_case_table_names=0)でデータベース名の大文字小文字を区別するので、Fsv3 と fsv3 は別の名前です。
シェルから出す
$ mysql -N -e "SHOW DATABASES"
Fsv3
fsv
fsv2
information_schema
...
mysqlshow コマンドでも同じ一覧が表の形で出ます。
-N を付けると見出し行(Database)が出ないので、スクリプトで1行ずつ処理するときに使います。ログインの指定は mysql -u root -p の記事を見てください。
文字コード・表の数・サイズも出す
mysql> SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
-> FROM information_schema.SCHEMATA ORDER BY SCHEMA_NAME;
+--------------------+----------------------------+------------------------+
| SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+--------------------+----------------------------+------------------------+
| Fsv3 | utf8mb4 | utf8mb4_0900_ai_ci |
| fsv | utf8mb4 | utf8mb4_0900_ai_ci |
| fsv2 | utf8mb4 | utf8mb4_ja_0900_as_cs |
| information_schema | utf8mb3 | utf8mb3_general_ci |
...
文字コードを指定せずに作ったデータベースは、サーバーの既定(utf8mb4 / utf8mb4_0900_ai_ci)になります。1つのデータベースの作成文は SHOW CREATE DATABASE fsv; で出ます。
表の数とサイズは information_schema.TABLES を集計して出します。
SELECT TABLE_SCHEMA, COUNT(*) AS tables,
ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS size_mb
FROM information_schema.TABLES
GROUP BY TABLE_SCHEMA ORDER BY size_mb DESC;
表が1つも無いデータベースは TABLES に行が無いので、この集計には出てきません。表の無いデータベースも出したいなら、SCHEMATA に LEFT JOIN します。
mysql> SELECT s.SCHEMA_NAME, COUNT(t.TABLE_NAME) AS tables
-> FROM information_schema.SCHEMATA s
-> LEFT JOIN information_schema.TABLES t ON t.TABLE_SCHEMA = s.SCHEMA_NAME
-> WHERE s.SCHEMA_NAME LIKE 'fsv%' GROUP BY s.SCHEMA_NAME;
+-------------+--------+
| SCHEMA_NAME | tables |
+-------------+--------+
| fsv | 1 |
| fsv2 | 0 |
+-------------+--------+
DATA_LENGTH と INDEX_LENGTH は統計から出る概算で、表を作った直後や大量に更新した後は実際とずれます。中の表の一覧は テーブル一覧の記事にまとめています。
データベースを切り替える
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| NULL |
+------------+
mysql> USE fsv;
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| fsv |
+------------+
ログイン直後は NULL で、どのデータベースも選ばれていません。この状態で表名だけを書くと ERROR 1046 (3D000): No database selected になります。mysql -u ユーザー -p fsv のように最後にデータベース名を付けると、選んだ状態でログインできます。
| エラー | 原因 |
|---|---|
ERROR 1049 (42000): Unknown database 'nosuchdb' |
その名前のデータベースが無い。大文字小文字の違い(fsv3 と Fsv3)でも出る |
ERROR 1044 (42000): Access denied for user 'app1'@'localhost' to database 'fsv' |
データベースはあるが、そのユーザーに権限が無い |
ERROR 1007 (HY000): Can't create database 'fsv'; database exists |
同じ名前で CREATE DATABASE した。IF NOT EXISTS を付ければエラーにならない |
権限で一覧が変わる
権限を何も付けていないユーザーで SHOW DATABASES を実行すると、出るのは information_schema と performance_schema の2つだけでした。GRANT ALL PRIVILEGES ON fsv.* を付けると fsv が加わります。「データベースが一覧に無い」ときは、名前の誤りより先に、ログインしているユーザーと権限を確かめます。
SELECT CURRENT_USER();
SHOW GRANTS;
権限の付け方は ユーザー作成と GRANT の記事にまとめています。
関連: MySQLでテーブル一覧を表示する / MySQLでテーブル定義を確認する / PostgreSQLでデータベース一覧を表示する