こんにちは sohnishi です。
突然ですが、みなさんMySQLにおけるsql_modeというものをご存知でしょうか。
私は最近知りました。。。
普段、sql_modeの事など気にして開発したことはありません。。。
つい先日、
原因不明のバグと格闘していました。
PHPでの改修作業を行なっていると、一切触っていない箇所で、
Field ‘hogehoge’ doesn’t have a default value
が発生し、???な状況になりました。
ソースのどこを探しても、hogehogeに値を入れてあげている箇所がありません。
もしかして本番でも動いてないの?そんなハズないよな〜と思いつつ格闘していると、
MySQLのバージョン差異によるsql_modeの違いが原因でした。
改修と同時に諸々のバージョンアップを行なっていたため、
MySQLのバージョンもそれに合わせてしまっていたのです。
MySQLバージョン:5.7.23
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’
MySQLバージョン:5.5.x(確か)
sql_mode:”
この違いで具体的にどのような事が起きるかというと、
後者(sql_mode:”)は、
INSERT時、Not Nullのフィールドに値を入れなくてもINSERTできちゃうんです。。。
どうやらNOT NULL補完という 今の私には存在意義がよくわからない機能が働くようです。
INT型のフィールドには、勝手に「0」を入れられていました。
VARCHAR型のフィールドは空文字を入れられてしまいます。
その他は試していません。
詳しい方、NOT NULL補完の存在意義を教えてください。
それでは。