[MySQL]Dockerで環境構築したWebアプリのDBを確認する

#はじめに
**前提**：以下の記事どおりに環境構築したWebアプリの、DBの確認方法を記しておきます

>[[Docker] Ruby2.7.2 / Rails6.0.3 / MySQL8.0の開発環境構築できたメモ](https://qiita.com/ayalikesweb/items/4167c8a8e40441b10cfe)


「とりあえずDBの中身見れた！」という状態の自分用メモです。
DB、SQLについても初心者なので、誤り等はご指摘いただけると幸いです。

#環境

- macOS Catalina
- Docker version 20.10.2
- docker-compose version 1.27.4

（その他は上記リンクの環境です）


#DB確認方法

##DBコンテナに接続
```r
docker-compose up -d     #バックグラウンドでコンテナ起動
docker-compose exec db bash    #bashを開いてdbコンテナに命令できる状態にする
```
`root@コンテナID:/#`の表示が出ていればOK

##MySQLのサービスに入る
```r
mysql -u root -p

#passwordを聞かれるので、「.env」ファイルの「DB_ROOT_PASSWORD」に指定したpasswordを入力してEnter
```
`Welcome to the MySQL monitor.`・・・
`mysql>`の表示が出ていればOK

##DB情報を確認するコマンド
###存在しているDBを確認
```
show databases;
```
```
mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| myapp_development  |
| myapp_test         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
```

###選択したDBのテーブル確認
```
show tables from データベース名;
```
```
mysql> show tables from myapp_development;

+------------------------------+
| Tables_in_myapp_development  |
+------------------------------+
| ar_internal_metadata         |
| areas                        |
| schema_migrations            |
| spots                        |
+------------------------------+
```

###選択したテーブルのカラム確認
```r
SHOW COLUMNS FROM テーブル名 FROM データベース名;
```
```
mysql> SHOW COLUMNS FROM areas FROM myapp_development;

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | bigint       | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | NO   |     | NULL    |                |
| created_at | datetime(6)  | NO   |     | NULL    |                |
| updated_at | datetime(6)  | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
```

##DBの中に入るコマンド
※データーベース名を指定する必要がなくなる

```
USE データベース名;
```
```
mysql> USE myapp_development;
```
`Database changed`と表示が出ていればOK

##格納データを確認するコマンド
`select` や `where` 等のSQL文[（Progate SQL）](https://prog-8.com/languages/sql)

###テーブル内の全データ確認
```
select * from テーブル名;
```
```
mysql> select * from areas;

+----+-----------+----------------------------+----------------------------+
| id | name      | created_at                 | updated_at                 |
+----+-----------+----------------------------+----------------------------+
|  1 | ?         | 2021-02-16 10:28:16.785206 | 2021-02-16 10:28:16.785206 |
|  2 | ??        | 2021-02-16 10:28:16.802190 | 2021-02-16 10:28:16.802190 |
|  3 | ???       | 2021-02-16 10:28:16.820425 | 2021-02-16 10:28:16.820425 |
|  4 | ????      | 2021-02-16 10:28:16.836546 | 2021-02-16 10:28:16.836546 |
+----+-----------+----------------------------+----------------------------+
```

#出力結果の文字化けを修正
##MySQLのデフォルトの文字コード確認

```
show variables like 'character%';
```
```
mysql> show variables like 'character%';

+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | latin1                         |
| character_set_connection | latin1                         |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | latin1                         |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8                           |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
```

`character_set_connection`が`latin1`になっていると日本語部分が文字化けしてしまう
= where構文で日本語をフィルタしてもヒットしない

##文字コードを日本語と絵文字に対応させる
方法は３つ

① MySQLサービス内で設定
② `/etc/my.cnf`を書き換える
③ `docker-compose.yml`のdbのcommandに、
　`mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci`を追記


- （②のファイルの場所がわかりません。。どこ？）
- （③を追記してコンテナ再起動してもできなかった。。なぜ？）

以下は①の方法です。
※ MySQLサービスから出ると設定も元に戻ってしまいます


###① MySQLサービス内で設定
```
SET NAMES 'utf8mb4';
```
`Query OK, 0 rows affected (0.00 sec)`と出力される
これだけです！

###MySQLの文字コード確認
```
mysql> show variables like 'character%';

+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8                           |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
```
文字コードが`utf8mb4`に変わってます。

- `utf8`　文字を1〜3バイトで表現　→日本語対応
- `utf8mb4`　文字を1〜4バイトで表現　→日本語と絵文字対応 🐳


>[utf8とutf8mb4の違い【MySQL】](https://penpen-dev.com/blog/mysql-utf8-utf8mb4/)


###テーブル内の全データ確認
```
select * from テーブル名;
```
```
mysql> select * from areas;

+----+-----------+----------------------------+----------------------------+
| id | name      | created_at                 | updated_at                 |
+----+-----------+----------------------------+----------------------------+
|  1 | サ　　　　　| 2021-02-16 10:28:16.785206 | 2021-02-16 10:28:16.785206 |
|  2 | サン　　　　| 2021-02-16 10:28:16.802190 | 2021-02-16 10:28:16.802190 |
|  3 | サンプ　　　| 2021-02-16 10:28:16.820425 | 2021-02-16 10:28:16.820425 |
|  4 | サンプル　　| 2021-02-16 10:28:16.836546 | 2021-02-16 10:28:16.836546 |
+----+-----------+----------------------------+----------------------------+
```


**🎉 日本語表記になりました！**


#さいごに
**SQL文**を使えば、DBから必要なデータだけを取得したり、追加や削除もできます。
Webアプリ開発を進めつつ、DB、SQLの扱いにも慣れていきたいと思います。