第18回 MySQL5.7のデフォルトのSQLモードを確認してみるで、5.6までと5.7までのSQLモードのデフォルトがどのように変更されたのかについて説明させていただきました。しかし、第18回で紹介したSQLモード以外にも、設定することができるSQLモードがMySQLには沢山あります。
ということで、何回かに分けてMySQLのSQLモードについて紹介していきます。
SQLモードの使い方
ここでは、SQLモードの確認方法と設定方法について簡単に説明していきます。
現在のSQLモードを確認する
第18回でも軽く紹介しましたが、以下のコマンドでglobalの設定が確認できます。
また、接続しているセッションでの変更を行った際には、以下のようにsessionのsql_modeを確認しましょう。
今回はまだ何も変更を加えていないため、同じものが出力されていることがわかります。
SQLモードを設定する
SQLモードの設定方法ですが、その他の設定と同様にmy.cnf
を設定する方法と、サーバ起動時にコマンドで--sql-mode
オプションを指定する方法と、繋いでいるクライアントで設定する方法があります。
my.cnf
を利用する際には、第31回 MySQLのオプションファイル my.cnfの豆知識[その1]で説明されているとおり、後から読み込まれたファイルの設定で上書きされてしまいます。なので、もしSQLモードが思った通りに設定できない場合は、後から読み込みが行われるファイルで上書きがされていないか確認してみてください。
接続しているクライアントで設定をしたい場合には、以下のようにSET
ステートメントで設定をしましょう。接続しているセッションだけで設定を変更したい場合はSET SESSION
を使って、全体で変更したい場合はSET GLOBAL
を使いましょう。
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_SUBSTITUTION
7個のSQLモードがデフォルトで設定されました。これらのSQLモードに関しては、第18回で説明を行いましたので改めて説明はしません。
NO_AUTO_VALUE_ON_ZERO
このモードは、AUTO_INCREMENT
なカラムを持っているテーブルに対して影響がある場合があります。
通常AUTO_INCREMENT
なカラムにNULLや0を挿入すると、自動的に次のシーケンス番号を生成して置き換えます。しかし、このモードが有効になっていると、0はシーケンス番号に置き換えられることはありません。そもそもAUTO_INCREMENT
なカラムに0を入れるというのもどうかと思いますが、運用上必要になることもあるかと思います。
ただし、このモードを使った時にリストアには注意が必要です。うっかり移行先のサーバでこのモードを設定し忘れると、0が挿入されたデータに次のシーケンス番号が振られて、データに差異が生まれてしまうので注意をしましょう。
このモードの挙動を確認するために、AUTO_INCREMENT
なidを持った簡単なusersテーブルを作成してみます。
作成したテーブルにNULLと0を入れた時にどうなるか確認してみましょう。
NULLと0を指定した場合にシーケンシャルな番号が割り振られたのがわかると思います。ここで、NO_AUTO_VALUE_ON_ZERO
を有効にしてみます。
そして、同様に0とNULLを挿入して結果を確認してみましょう。
先ほどと挿入した結果が変わり、idがシーケンシャルな番号ではなく、指定をした0が入っていることがわかると思います。
NO_FIELD_OPTIONS, NO_KEY_OPTIONS, NO_TABLE_OPTIONS
これらのSQLモードは、MySQLの固有のカラムオプションやインデックスオプション、テーブルのオプションなどをSHOW CREATE TABLE
で表示させないようにするSQLモードです。これらの設定は、mysqldump
でスキーマなどをバックアップしたときにも影響があるので注意しましょう。
使い所としては、たとえばMySQLから他のRDBMSにデータを移し替える場合に、MySQL固有のEngineの設定などが不要な場合に利用されます。
先ほど作成したusers
テーブルで、NO_TABLE_OPTIONS
を例に取り説明します。
この時点では、ENGINE=InnoDB~~~
といったMySQL固有の情報が出力されていることがわかります。続いて、NO_TABLE_OPTIONS
を有効にした状態でSHOW CREATE TABLE
を実行してみましょう。
以上のように、ストレージエンジンの設定などが消えていることがわかります。
まとめ
今回はMySQLのSQLモードについて紹介してみました。まだまだ紹介できていないオプションがたくさんあるので、これからも紹介していく予定です。