MySQL道普請便り

第60回 SQLモードについて[その1]

この記事を読むのに必要な時間:およそ 3.5 分

第18回 MySQL5.7のデフォルトのSQLモードを確認してみるで,5.6までと5.7までのSQLモードのデフォルトがどのように変更されたのかについて説明させていただきました。しかし,第18回で紹介したSQLモード以外にも,設定することができるSQLモードがMySQLには沢山あります。

ということで,何回かに分けてMySQLのSQLモードについて紹介していきます。

SQLモードの使い方

ここでは,SQLモードの確認方法と設定方法について簡単に説明していきます。

現在のSQLモードを確認する

第18回でも軽く紹介しましたが,以下のコマンドでglobalの設定が確認できます。

$ mysql -uroot
mysql > 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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+

また,接続しているセッションでの変更を行った際には,以下のようにsessionのsql_modeを確認しましょう。

mysql> SELECT @@session.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@session.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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+

今回はまだ何も変更を加えていないため,同じものが出力されていることがわかります。

SQLモードを設定する

SQLモードの設定方法ですが,その他の設定と同様にmy.cnfを設定する方法と,サーバ起動時にコマンドで--sql-modeオプションを指定する方法と,繋いでいるクライアントで設定する方法があります。

my.cnfを利用する際には,第31回 MySQLのオプションファイル my.cnfの豆知識[その1]で説明されているとおり,後から読み込まれたファイルの設定で上書きされてしまいます。なので,もしSQLモードが思った通りに設定できない場合は,後から読み込みが行われるファイルで上書きがされていないか確認してみてください。

接続しているクライアントで設定をしたい場合には,以下のようにSETステートメントで設定をしましょう。接続しているセッションだけで設定を変更したい場合はSET SESSIONを使って,全体で変更したい場合はSET GLOBALを使いましょう。

mysql> SET SESSION sql_mode='';
mysql> SELECT @@session.sql_mode;
+--------------------+
| @@session.sql_mode |
+--------------------+
|                    |
+--------------------+
1 row in set (0.00 sec)


mysql> SET GLOBAL sql_mode='';
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT @@global.sql_mode;
+-------------------+
| @@global.sql_mode |
+-------------------+
|                   |
+-------------------+
1 row in set (0.00 sec)

SET GLOBALステートメントを利用して設定した場合の注意点としては,5.7とそれ以前では設定した値を保存する方法がないため,サーバを再起動した時に設定が失われてしまうことに注意をしましょう。もしずっと適用したい場合には,忘れずにmy.cnfの有効な場所に記述しておきましょう。

MySQL5.7のデフォルトで設定されているSQLモードについて

MySQL5.7から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_SUBSTITUTION7個のSQLモードがデフォルトで設定されました。これらのSQLモードに関しては,第18回で説明を行いましたので改めて説明はしません。

著者プロフィール

木村浩一郎(きむらこういちろう)

GMOメディア株式会社 技術推進室所属のWebアプリケーションエンジニア。最近はミドルウェア・インフラ周りのことも少しずつ学習しています。趣味は将棋。好きな戦法は四間飛車。

Twitter:@kk2170

コメント

コメントの記入