# その他の重要な SQL モード

+ `Combination` モード
  + **`ANSI`**: 標準 `SQL` により良く適合するように構文と動作を変更
  + **`TRANDITIONAL`**: このモードでは、`TiDB` は「従来の」`SQL` データベースシステムのように動作する
  + **`ORACLE`**: **`PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER`**
+ `Single` モード
  + **`ONLY_FULL_GROUP_BY`**: **`SELECT`** リストが **`GROUP BY`** 節にない列を参照している場合は実行できません
  + **`NO_ZERO_DATE`**: `0000-00-00` のような日付は許可されていません
  + **`ERROR_FOR_DIVISION_BY_ZERO`**: テーブルに保存しようとすると `NULL` の代わりにエラーが返される
  + **`NO_ENGINE_SUBSTITUTION`**: 構文サポートのみ

--------------------------------------------------------------------------
詳細については、「`https://docs.pingcap.com/tidb/stable/sql-mode`」を参照する。

`ANSI`と`TRADITIONAL`の`SQL`モードは、複数のモードを可能にする`MySQL`の組み合わせモードです。

`ANSI` モード:モードによっては SQL 構文の処理方法を変更するものがあり、ANSI モードはこれらのモードのいくつかで構成されています。

ほとんどの SQL モードは 1 つの動作を変更します。これらには以下が含まれます。
- `NO_ZERO_DATE`は、厳密モードでも`MySQL`が通常許可する`'0000-00-00'`のような日付を禁止します。
- `ERROR_FOR_DIVISION_BY_ZERO`: エラーを発生させ、値をゼロで割ろうとするステートメントをすべて中止します。このモードが有効になっていない場合、`MySQL` は 0 による除算を `NULL` として評価し、警告を発します。

モードの例:
- `ANSI` は `REAL_AS_FLOAT`、`PIPES_AS_CONCAT`、`ANSI_QUOTES`、`IGNORE_SPACE` に相当する
- `TRADITIONAL`は`STRICT_TRANS_TABLES`、`STRICT_ALL_TABLES`、`NO_ZERO_IN_DATE`、`NO_ZERO_DATE`、`ERROR_FOR_DIVISION_BY_ZERO`、`NO_AUTO_CREATE_USER`に相当する
- `ORACLE`は`PIPES_AS_CONCAT`、`ANSI_QUOTES`、`IGNORE_SPACE`、`NO_KEY_OPTIONS`、`NO_TABLE_OPTIONS`、`NO_FIELD_OPTIONS`、`NO_AUTO_CREATE_USER`に相当する
- `ONLY_FULL_GROUP_BY` `GROUP BY` に出現する列が `SELECT`、`HAVING`、`ORDER BY` に表示されない場合、`GROUP BY` にない列は正常ではないとクエリが示されるため、この SQL は不正です。
- `NO_ZERO_DATE` 厳密モードでは、`0000-00-00` を正規の日付として使用しないでください。`IGNORE` オプションを使用してゼロ日付を挿入することはできます。非厳密モードではこの日付でもかまいませんが、警告が表示されます。
- `ERROR_FOR_DIVISION_BY_ZERO` このモードを有効にすると、`INSERT` または `UPDATE` の間に除数が 0 になると、システムがエラーを生成します。このモードが有効になっていない場合、除数が 0 のときに警告が生成され、`NULL` に置き換えられます。
- `NO_ENGINE_SUBJECT` 必要なストレージエンジンが無効またはコンパイルされていない場合に、ストレージエンジンが自動的に交換されるのを防ぎます。(構文のみ)