MySQL5.7になり、デフォルトのSQLモードが変更されました。ここでは、SQLモードの確認と変更方法について取り上げます。
SQLモードの確認
下記クエリで確認できます。
SELECT @@global.sql_mode;
SQLモードの種類
MySQL5.7ですと、デフォルトで7つのSQLモードが設定されています。
参考
https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html で各モードの詳細について確認できます。
ONLY_FULL_GROUP_BY
GROUP BY 句で名前が指定されていない非集約カラムを、選択リスト、HAVING 条件、または (MySQL 5.6.5 以降で) ORDER リストが参照するクエリーを拒否します。
STRICT_TRANS_TABLES
値を指定したとおりにトランザクションテーブルに挿入できない場合、ステートメントを中止します。非トランザクションテーブルの場合、値が単一行ステートメントで発生するか、複数行ステートメントの先頭行で発生した場合、ステートメントを中止します。
NO_ZERO_IN_DATE
年の部分は非ゼロであるが月または日の部分が 0 である日付をサーバーが許可するかどうかに影響します。(このモードは ‘2010-00-01’ や ‘2010-01-00′ などの日付に影響しますが、’0000-00-00’ には影響しません。サーバーが ‘0000-00-00’ を許可するかどうかを制御するには、NO_ZERO_DATE モードを使用してください。)
NO_ZERO_DATE
サーバーが ‘0000-00-00’ を有効な日付として許可するかどうかに影響します。
ERROR_FOR_DIVISION_BY_ZERO
MOD(N,0) を含むゼロ除算の処理に影響します。
NO_AUTO_CREATE_USER
認証情報が指定される場合を除き、ほかの方法で実行される場合は、GRANT ステートメントで新規ユーザーを自動的に作成しません。ステートメントは IDENTIFIED BY を使用した空以外のパスワードを指定するか、IDENTIFIED WITH を使用した認証プラグインを指定する必要があります。
NO_ENGINE_SUBSTITUTION
CREATE TABLE または ALTER TABLE などのステートメントが無効またはコンパイルされていないストレージエンジンを指定したとき、デフォルトのストレージエンジンの自動置換を制御します。
SQLモードの変更
方法1. SET文で変更
# NO_ENGINE_SUBSTITUTIONだけにする。
SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
# mysql5.7のデフォルト設定に戻す。
SET 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';
方法2. 設定ファイル(my.cnf)を修正して変更
[mysqld]
sql_mode = NO_ENGINE_SUBSTITUTION
設定変更後、MySQLを再起動させます。