tabimoba.net

とあるエンジニアの雑記帳

CodeIgniterで「Field 'user_data' doesn't have a default value」が表示される場合の対応方法

MySQL5.6をデータベースとして使用する環境下のCodeIgniterでデータベースをセッションデータの保存先にすると、「Field 'user_data' doesn't have a default value」というエラーメッセージが表示される場合があります。

このような場合は、my.cnfを以下のように変更してからMySQLdを再起動することで解消されます。

変更前

[mysqld]
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
max_allowed_packet=128MB

変更後

[mysqld]
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION
max_allowed_packet=128MB

原因は、MySQL5.6では「STRICT_TRANS_TABLES」(Strict Mode)がデフォルトで有効であるためです。ちなみに、Strict Modeとは以下の通りです。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 4.2.6 SQL モードより引用

Strict Mode は、MySQL が無効または不明な入力値をどのように処理するかを制御します。何らかの理由で値は無効になることがあります。たとえば、カラムに対して違うデータの入力、範囲を超える入力などがあった場合です。値が不明であるということは、挿入する新規のレコードに、カラム値がない場合で、定義に、明示的な DEFAULT 節がないときです。

CodeIgniterのci_sessionテーブルは、user_dataのデフォルト値がNoneであるため、デフォルト値がセットされる状況でエラーが発生しているものと思われます。