SQLモードの確認と変更

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を再起動させます。

よかったらシェアしてね!
目次