CakePHP3 MySQL設定(CakePHP3チュートリアルでのデータベース作成と設定)

#はじめに
CakePHP3チュートリアル実施時にMySQL関連で色々引っかかったので、備忘録的な形でまとめます。

##データベース作成
MySQL起動

```terminal
mysql -uroot -p
```

MYSQL内にデータベース作成

```terminal
mysql> CREATE DATABASE cake_cms;
Query OK, 1 row affected (0.11 sec)
```
MySQL内のデータベース一覧表示　

```terminal
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| cake_cms           |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.41 sec)
```

MySQL内のデータベースの削除

```terminal
mysql> DROP DATABASE cake_cms;
Query OK, 0 rows affected (0.27 sec)
```
存在しているデータベースへの接続

```terminal
mysql> USE cake_cms;
Database changed
```

テーブル作成

```terminal
mysql> CREATE TABLE users (
    ->     id INT AUTO_INCREMENT PRIMARY KEY,
    ->     email VARCHAR(255) NOT NULL,
    ->     password VARCHAR(255) NOT NULL,
    ->     created DATETIME,
    ->     modified DATETIME
    -> );
Query OK, 0 rows affected (0.06 sec)
```

データベース内のテーブル一覧表示

```terminal
mysql> SHOW TABLES;
+--------------------+
| Tables_in_cake_cms |
+--------------------+
| users              |
+--------------------+
1 row in set (0.05 sec)
```

SELECT:テーブルからデータ取得

```terminal
mysql> SELECT * FROM users;
Empty set (0.08 sec)
```

INSERT:テーブルにデータ追加

```terminal
mysql> INSERT INTO users (email, password, created, modified)
    -> VALUES
    -> ('cakephp@example.com', 'sekret', NOW(), NOW());
Query OK, 1 row affected (0.24 sec)

mysql> SELECT * FROM users;
+----+---------------------+----------+---------------------+---------------------+
| id | email               | password | created             | modified            |
+----+---------------------+----------+---------------------+---------------------+
|  1 | cakephp@example.com | sekret   | 2019-04-11 21:55:06 | 2019-04-11 21:55:06 |
+----+---------------------+----------+---------------------+---------------------+
1 row in set (0.02 sec)
```

ここまでの操作が分かってればcakePHP3チュートリアルのデータベースの作成はできると思います。

##データベース設定

###ユーザーの認証方式変更

```terminal
mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.01 sec)
```

```terminal
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Password';
Query OK, 0 rows affected (0.09 sec)

mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
5 rows in set (0.03 sec)
```
rootユーザーの認証方式がcaching_sha2_passwordからmysql_native_passwordに変更されました。

###デフォルトの認証方式の変更

```terminal
vi /usr/local/etc/my.cnf
```

default_authentication_plugin= mysql_native_passwordを追加。

```my.cnf
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
default_authentication_plugin= mysql_native_password
```

app.phpのusername,password,databaseは先ほど認証方式の変更を行なったユーザーのものをそれぞれ設定してください。

```app.php
    'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            //'port' => 'non_standard_port_number',
            'username' => 'root',
            'password' => 'secret',
            'database' => 'cake_cms',
            'encoding' => 'utf8mb4',
            'timezone' => 'UTC',
            'flags' => [],
            'cacheMetadata' => true,
            'log' => false,
            'quoteIdentifiers' => false,
            //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],

            'url' => env('DATABASE_URL', null),
        ],
```

これで起動し直せば、Databaseの項目部分が```CakePHP is able to connect to the database.```になり、無事設定は完了になります。

###最後に
平日の仕事終わりにやってましたが設定だけで２日かかりましたね・・・
Railsチュートリアルや環境構築など色々調べながらやる方が多いと思うので備忘録としてQiitaにまとめながら作業を進めるのも後で振り返りもできてオススメなのでQiitaに何書こうか悩む人はぜひやってみてはいかがでしょうか？

##参考
[【MySQL, SQL】データベースを扱う基本SQL一覧](https://qiita.com/knife0125/items/bb095a85d1a5d3c8f706)

[CakePHP is NOT able to connect to the database. を解決する]
(https://nekonenene.hatenablog.com/entry/2016/04/01/211653)

[phpからMySQL 8.0へPDOで接続時「SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client」]
(https://symfoware.blog.fc2.com/blog-entry-2160.html)