22185


**質問1.SQL モードはどういう階層構造になっているのでしょうか？**  
・NO_ENGINE_SUBSTITUTIONは、Strict SQL Modeの一部？  
・それとも並列関係？  
・あるいは全く別の概念？  
・SQL モードとsql_modeは意味が異なる？  
・Strict SQL Modeは、sql_modeの値ではなく、状態の総称？

* * *

**質問2.デフォルト設定値は、バージョンだけでは判断できず入れ方によっても異なる？**  
・5.5を5.6.29 へアップデートしたところ、デフォルトで下記となりました

[code]

    SELECT @@sql_mode;
    
[/code]

> STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

* * *

> MySQL 5.6.6 以降でのデフォルトの SQL モードは NO_ENGINE_SUBSTITUTION で、MySQL 5.6.5
> 以前では、これは空白です (モードの設定なし)。

<https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html>


CC BY-SA 3.0
2016-02-16T11:03:39.773
22172
2016-02-17T03:50:54.430
7886
question
mysql
NO_ENGINE_SUBSTITUTIONは、Strict SQL Modeの一部？ 階層関係を教えて


提示されているマニュアルにも、

> 厳密な SQL モードは、STRICT_ALL_TABLES または STRICT_TRANS_TABLES のいずれかが有効な場合に有効になります

とありますから、

>   1. NO_ENGINE_SUBSTITUTIONは、Strict SQL Modeの一部？
>

~~一部というよりは、strict sql mode が成立するための条件の一つ~~ 。

NO。構成要素ではありません。`Strict SQL Mode` は、

> MySQL が INSERT や UPDATE などのデータ変更ステートメントで無効な値または欠落した値を処理する方法を制御します。

であり、`NO_ENGINE_SUBSTITUTION` は、

> CREATE TABLE または ALTER TABLE
> などのステートメントが無効またはコンパイルされていないストレージエンジンを指定したとき、デフォルトのストレージエンジンの自動置換を制御します。

ですので、データ変更に対するモードと、テーブル変更に対するモードとは関係がないものと考えます。

>   2. SQL モードとsql_modeは意味が異なる？
>

[MySQL :: MySQL 5.6 リファレンスマニュアル :: A.3 MySQL 5.6 FAQ: サーバー SQL
モード](https://dev.mysql.com/doc/refman/5.6/ja/faqs-sql-
modes.html#idm140151930530688)

> サーバー SQL モードは、MySQL でサポートされる SQL 構文、および実行されるデータ妥当性チェックの種類を定義します。

小さくは異ならない。大きく考えればレイヤーが異なり、`SQLモード`は、動作の種類のことであり、sql_mode はその値。

>   3. Strict SQL Modeは、sql_modeの値ではなく、状態の総称？
>

NO.  
sql_mode に、STRICT_ALL_TABLES または STRICT_TRANS_TABLES が入っている時に、strict sql mode
になる。

という感じなのではないでしょうか。

> 質問2. デフォルト設定値は、バージョンだけでは判断できず入れ方によっても異なる？

バージョンで判断していると思いますが、同じバージョンを異なる入れ方をしたら、設定値が異なったのでしょうか？

# 修正

> NO_ENGINE_SUBSTITUTIONは、Strict SQL Modeの一部？

で`NO_ENGINE_SUBSTITUTION`を、`STRICT_TRANS_TABLES`と読み間違えていたので修正しました。


CC BY-SA 3.0
2016-02-17T00:59:25.330
22185
2016-02-17T03:50:54.430
2016-02-17T03:50:54.430
7471
7471
22172
answer