【Amazon Aurora（MySQL互換）】create tableする前に確認しておきたい設定項目まとめ

Amazon Aurora（MySQL互換のもの）で、create tableする前に確認しておきたい設定項目をまとめました。

## 環境
- Amazon Aurora：2.08.1（MySQL5.7と互換性のあるもの）
    - 「開発/テスト」用
    - DBインスタンスサイズ：db.r5.large
   
- クライアントOS：Windows10

## 確認項目
対象DBに割り当てられている「DBクラスターのパラメータグループ」を確認します。
Amazon Aurora（MySQL5.7互換）の場合、デフォルトでは「default.aurora-mysql5.7」が割り当てられていますが、こちらの編集はできないので、DBクラスターのパラメータグループを新規作成して割り当て、編集するようにしましょう。

パラメータグループの新規作成と割り当ての方法については、
[【Amazon Aurora】日本の環境で快適に使うための初期設定手順 ～ 文字コード、タイムゾーン、パブリックアクセス ～ | Qiita](https://qiita.com/C_HERO/items/4929502c2641b2406475)
の手順2, 3に記載していますので、そちらをご覧ください。

### 1. 文字コード
#### (1)設定内容に関して
日本語を扱うのであれば、「utf8」もしくは「utf8mb4」にしましょう。
両者の違いは、以下の通り。

|文字コード|UnicodeのSMPのサポート<br>（絵文字の使用などに必要）|1文字当たりのサイズ|
|---|---|---|
|utf8|なし|3バイト|
|utf8mb4|あり|4バイト|

絵文字も使用する可能性が少しでもあるなら、後者を選びましょう。

#### (2)デフォルト値と設定値
以下の通り設定を変更します。

|名前|デフォルト値<br>（一度も変更を適用していない場合）|設定値|
|---|---|---|
|character_set_client|utf8mb4|utf8mb4|
|character_set_connection|utf8mb4|utf8mb4|
|character_set_database|latin1|utf8mb4|
|character_set_results|utf8mb4|utf8mb4|
|character_set_server|latin1|utf8mb4|

### 2. タイムゾーン
#### (1)設定内容に関して
日本時間で使用する場合は、「time_zone」の設定値を「Asia/Tokyo」にします。

「time_zone」のデフォルト値は「SYSTEM」で、「system_time_zone」を参照することを意味し、その設定値は、日本時間より、9時間遅れている「UTC」（協定世界時）となっています。
文章だと分かりづらいので、以下の通り、表にまとめておきます。

|名前|デフォルト値|内容（意味合い）|
|---|---|---|
|system_time_zone|UTC|協定世界時（日本時間より9時間遅れ）|
|time_zone|SYSTEM|「system_time_zone」の設定値を摘要|

「system_time_zone」の変更はできないため(2020年7月24日現在）、「time_zone」を変更します。

#### (2)デフォルト値と設定値
上記内容を踏まえ、以下の通り設定を変更します。

|名前|デフォルト値|設定値|
|---|---|---|
|time_zone|SYSTEM|Asia/Tokyo|

### 3. デフォルトストレージエンジン
#### (1)設定内容に関して
create tableでエンジンを指定しなかった際に設定されるストレージエンジンです。
デフォルトでは、InnoDBになっていて、特別な理由がない限りは設定を変更しなくても大丈夫。

ちなみに、MySQLの代表的なストレージエンジンとしては以下の5種類があり、その違いは以下の通り（公式サイトより一部項目を抜粋）。

|機能|MyISAM|Memory|InnoDB|Archive|NDB|
|---|---|---|---|---|---|
|Bツリーインデックス|○|○|○|×|×|
|Tツリーインデックス|×|×|×|×|○|
|全文検索インデックス|○|×|○（note3）|×|×|
|外部キーのサポート|×|×|○|×|○（note5）|
|データキャッシュ|×|N/A|○|×|○|
|ストレージの制限|256Tバイト|RAM|64Tバイト|なし|384Eバイト|
|ロック粒度|テーブル|テーブル|行|行|行|
|トランザクション|×|×|○|×|○|

※○：機能あり、×：機能なし

#### (2)デフォルト値と設定値
ストレージエンジンにInnoDBを使用する場合は変更不要ですが、一度設定値を確認しておくようにしましょう。

|名前|デフォルト値|設定値|
|---|---|---|
|default_storage_engine|InnoDB|InnoDB|

### 4. SQLモード
#### (1)設定内容に関して
デフォルトでは0（設定値なし）となっています。
このままだと、「暗黙のカラム指定の変更」（create table, alter tableした際にカラムの型が指定した内容とは異なる内容に暗黙の裡に変えられてしまう事象）など、気づかないうちに意図しない変更が加えられてしまう可能性があります。
これを許容する場合はそのままで大丈夫ですが、基本的には、以下のいずれかを設定しておいたほうがよいでしょう。

|設定値|内容|
|---|---|
|STRICT_ALL_TABLES|すべてのストレージエンジンについて厳密モードを有効する。無効なデータ値は拒否される。|
|STRICT_TRANS_TABLES|トランザクションストレージエンジンの厳密モードを有効にし、可能な場合は非トランザクションストレージエンジンでも有効にする。|

ストレージエンジンがInnoDBの場合、トランザクションストレージエンジンに該当するので「STRICT_TRANS_TABLES」を設定しておけばOKです。

#### (2)デフォルト値と設定値
上記内容を踏まえ、以下の通り設定を変更します。

|名前|デフォルト値|設定値|
|---|---|---|
|sql_mode|0|STRICT_TRANS_TABLES|

#### (3)注意点
SQLモードは、DBパラメータグループにも同項目が存在します。
DBパラメータグループをデフォルト値から変更した場合はそちらが優先されるので、その点には注意しましょう。

## 参考

#### 1. 文字コード

- [MySQLの照合順序問題 | 株式会社クインテット](https://pando.life/qwintet/article/833)
- [10.10 Supported Character Sets and Collations(version5.7) | MySQL](https://dev.mysql.com/doc/refman/5.7/en/charset-charsets.html)

#### 2. タイムゾーン
- [time_zone設定の違うMySQLのレプリケーションについて | 角待ちは対空](https://blog.yux3.net/entry/2018/12/02/182113)
- [協定世界時 (UTC) | 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word11831.html)

#### 3. デフォルトストレージエンジン

- [5.1.10 Server SQL Modes | MySQL 5.7 Reference Manual](https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html)

#### 4. SQLモード

- [5.1.10 Server SQL Modes | MySQL 5.7 Reference Manual](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html)
- [1.8.3.3 Constraints on Invalid Data | MySQL 5.7 Reference Manual](https://dev.mysql.com/doc/refman/5.7/en/constraint-invalid-data.html)
- [13.1.18.6 Silent Column Specification Changes | MySQL 5.7 Reference Manual](https://dev.mysql.com/doc/refman/5.7/en/silent-column-changes.html)