SQLモード †
- MySQLでは指定された値のままレコードに格納できなくても、なるべくエラーにならないように処理を続けるようになっている
- sql_modeをstrictモードで設定すれば、このようなMySQL特有の振る舞いを変更して他のSQLデータベースのように使える
現在のモードを確認 †
select @@global.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
モード †
ONLY_FULL_GROUP_BY †
- GROUP BY句で名前が指定されていない非集約カラムを、選択リスト、HAVING条件、またはORDERリストが参照するクエリを拒否
STRICT_TRANS_TABLES †
- 値を指定した通りにトランザクションテーブルに挿入できない場合、ステートメントを中止
- 非トランザクションテーブルの場合、値が単一行ステートメントで発生するか、複数行ステートメントの先頭行で発生した場合、ステートメントを中止
NO_ZERO_IN_DATE †
- 年の部分はゼロではないが、月または日の部分が0である日付がこのモードの制御対象になる
- '0000-00-00'は制御対象ではない。'0000-00-00'についてはNO_ZERO_DATEモードを使う。
- このモードおよび厳密モード1が有効な場合、IGNOREが指定されている場合を除き、ゼロ部分を含む日付は許可されず、エラーになる。
- INSERT IGNOREおよびUPDATE IGNOREの場合、ゼロ部分を含む日付は'0000-00-00'として挿入され、警告になる。
NO_ZERO_DATE †
- このモードと厳密モードが有効な場合、IGNOREが指定されている場合を除き、'0000-00-00'は許可されず、エラーになる。
- INSERT IGNOREおよびUPDATE IGNOREの場合は、'0000-00-00'が許可され、警告になる
ERROR_FOR_DIVISION_BY_ZERO †
- このモードおよび厳密モードが有効な場合、ゼロによる除算はエラーになる
- INSERT IGNOREおよびUPDATE IGNOREの場合は、ゼロによる除算はNULLを挿入し、警告になる
NO_AUTO_CREATE_USER †
- 認証情報が指定される場合を除き、他の方法で実行される場合は、GRANTステートメントで新規ユーザーを自動的に作成しない
NO_ENGINE_SUBSTITUTION †
- CREATE TABLEまたはALTER TABLEなどのステートメントが無効またはコンパイルされていないストレージエンジンを指定した時、デフォルトのストレージエンジンの自動置換を制御する。
- このモードが有効な場合、目的のエンジンが利用できない場合はエラーになり、テーブルは作成または変更されない。
TRADITIONAL †
- 以下モードを指定したのと同等
- STRICT_TRANS_TABLES
- STRICT_ALL_TABLES
- NO_ZERO_IN_DATE
- NO_ZERO_DATE
- ERROR_FOR_DIVISION_BY_ZERO
- NO_AUTO_CREATE_USER
- NO_ENGINE_SUBSTITUTION