Golden Road

好きだという熱こそが最低限で最高の希望

HomebrewでインストールしたMariaDBをStrictモードに設定

inabaです。

MariaDBをHomebrewでインストールして使っていたのですが、
NOT NULL制約のカラムにDEFAULT NULLが設定されていると、INSERT時に値を設定していないカラムにNULLが入ってしまうという事がありました。
これはStrictモードが設定されていると起きないそうなので、Strictモードの設定をします。

デフォルトのsql_mode

Strictモードはmysqlにログイン後、sql_modeの値で設定されているか確認できます。

MariaDB [(none)]> SELECT @@SQL_MODE, @@GLOBAL.SQL_MODE;
+--------------------------------------------+--------------------------------------------+
| @@SQL_MODE                                 | @@GLOBAL.SQL_MODE                          |
+--------------------------------------------+--------------------------------------------+
| NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+--------------------------------------------+
1 row in set (0.00 sec)

デフォルトではNO_AUTO_CREATE_USERNO_ENGINE_SUBSTITUTIONが設定されており、
Strictモードの設定値であるSTRICT_ALL_TABLESまたはSTRICT_TRANS_TABLESが設定されていません。

my.cnfのパス

my.cnfのパスを調べます。

mariadb.com

上記には/etc/my.cnfが一番上に書いてありますが、/etc/my.cnfに設定ファイルを置いてみても反映されませんでした。

qiita.com

上記の方法を試します。

$ mysql --help | grep my.cnf
/usr/local/etc/my.cnf ~/.my.cnf 
                      order of preference, my.cnf, $MYSQL_TCP_PORT,

$ cat /usr/local/etc/my.cnf
#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]

#
# include all files from the config directory
#
!includedir /usr/local/etc/my.cnf.d

/usr/local/etc/my.cnfに設定ファイルmy.cnfがありました。

設定

先程の設定に!includedir /usr/local/etc/my.cnf.dとあるので、/usr/local/etc/my.cnfを直接編集するのではなく、/usr/local/etc/my.cnf.dに設定ファイルを新しく作るようにします。

設定値にはデフォルトで設定されていたNO_AUTO_CREATE_USERNO_ENGINE_SUBSTITUTIONも含めておきます。
含めないとデフォルトで設定されていた上記2つは消えてしまいます。

Strictモードの設定値はSTRICT_ALL_TABLESSTRICT_TRANS_TABLESがあります。
違いについてはDifference between strict_all_tables and strict_trans_tablesがわかりやすいです。
自分は間違った値が入ってほしくなかったのでSTRICT_ALL_TABLESを使用するようにしました。
InnoDBだと違いは無いようなのでInnoDBの場合はどちらを選んでも良いでしょう。

$ emacs /usr/local/etc/my.cnf.d/my.cnf
$ cat /usr/local/etc/my.cnf.d/my.cnf 
[mysqld]
sql_mode = NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,STRICT_ALL_TABLES

# MariaDBの再起動
$ mysql.server restart
Shutting down MySQL
.. SUCCESS! 
Starting MySQL
.170105 01:51:36 mysqld_safe Logging to '/usr/local/var/mysql/i.local.err'.
 SUCCESS! 

設定値を確認してみます。

MariaDB [(none)]> SELECT @@SQL_MODE, @@GLOBAL.SQL_MODE;
+--------------------------------------------------------------+--------------------------------------------------------------+
| @@SQL_MODE                                                   | @@GLOBAL.SQL_MODE                                            |
+--------------------------------------------------------------+--------------------------------------------------------------+
| STRICT_ALL_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | STRICT_ALL_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------------------------+--------------------------------------------------------------+
1 row in set (0.00 sec)

STRICT_ALL_TABLESが設定されている事が確認できました。

これでNOT NULL制約が厳密に適用されます。

今日はここまで。