MariaDBで strict_mode をオフに。

たぶん最近のバージョンの MariaDB は、初期設定として strict_mode がオンになっている。と、どうなるかというと、例えば「デフォルト値を設定していないカラムに、値を指定せずにデータを挿入しようとする」場合などに「Field 'xxx' doesn't have a default value」というエラーが出る。

このエラーを回避するには:

…と、これが真っ当な対処法で、安全。

なのだけれど:

というときは、strict_mode を無効にすれば良い。データ運用の安全性の面からはお勧めされませんが。

まずは現在の状態を確認。ターミナルを開いて、

sudo mysql -e 'select @@GLOBAL.sql_mode;'

を実行。うちの環境では以下のような出力となりました。

+-------------------------------------------------------------------------------------------+
| @@GLOBAL.sql_mode                                                                         |
+-------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------+

この出力に "STRICT_TRANS_TABLES" とか "STRICT_ALL_TABlES" という文字列が含まれていれば、strict_mode(厳密モード)が有効になっています。

これを無効にするには、

  1. 上記出力(STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION)をコピーしておく。
  2. MariaDB の設定ファイル(うちの環境では /etc/mysql/mariadb.conf.d/50-server.cnf)をエディタで開く。
  3. [mysqld] セクションに以下の行:
    sql_mode = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    を追加して保存。
    "" 内は、さっきコピーした文字列から STRICT_TRANS_TABLES や STRICT_ALL_TABLES を除いたもの。
  4. Mariadb を再起動。
    sudo systemctl restart mariadb

さて、strict_mode が無効になったかチェックしてみましょ。

sudo mysql -e 'select @@GLOBAL.sql_mode;'

…を実行してみると、

+-----------------------------------------------------------------------+
| @@GLOBAL.sql_mode                                                     |
+-----------------------------------------------------------------------+
| ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------+

良さそうです。

カテゴリ: