エラーは、最新のMYSQL 5.7ドキュメントに従って厳密モードである可能性があるSQLモードが原因です
MySQLドキュメント5.7は言う:
厳密モードは、サーバーが有効な日付として「0000-00-00」を許可するかどうかに影響します。厳密モードが有効でない場合、「0000-00-00」が許可され、挿入によって警告は生成されません。厳密モードが有効になっている場合、IGNOREが指定されていない限り、 '0000-00-00'は許可されず、挿入はエラーを生成します。INSERT IGNOREおよびUPDATE IGNOREの場合、 '0000-00-00'が許可され、挿入により警告が生成されます。
MYSQLモードを確認するには
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
STRICT_TRANS_TABLESモードを無効にする
ただし、フォーマットを許可するには 0000-00-00 00:00:00
、mysql構成ファイルまたはコマンドでSTRICT_TRANS_TABLESモードを無効にする必要があります
コマンドで
SET sql_mode = '';
または
SET GLOBAL sql_mode = '';
キーワードを使用する GLOBAL
は、スーパー特権が必要であり、それ以降、すべてのクライアントが接続する操作に影響します
上記が機能しない場合は、/etc/mysql/my.cnf
(ubuntuに従って)に移動してコメントアウトするよりもSTRICT_TRANS_TABLES
また、サーバーの起動時にSQLモードを永続的に設定する場合はSET sql_mode=''
、my.cnf
LinuxまたはMacOSに組み込みます。Windowsの場合、これはmy.ini
ファイルで行う必要があります。
注意
ただし、MYSQL 5.6ではデフォルトでストリクトモードは有効になっていません。したがって、MYSQL 6のドキュメントにあるように、エラーは発生しません
MySQLでは、「ゼロ」値「0000-00-00」を「ダミー日付」として保存できます。これは、NULL値を使用するよりも便利な場合があり、使用するデータとインデックスのスペースが少なくなります。'0000-00-00'を禁止するには、NO_ZERO_DATE SQLモードを有効にします。
更新
@ Dylan-Suが言っているバグの問題について:
これは、MYSQLが時間の経過とともに進化していく方法であり、製品のさらなる改善に基づいていくつかの変更が行われるバグではないと思います。
ただし、NOW()
関数に関する別の関連するバグレポートがあります。
日時フィールドはデフォルトのNOW()を受け入れません
もう1つの便利なメモ [ TIMESTAMPとDATETIMEの自動初期化と更新を参照]
MySQL 5.6.5以降、TIMESTAMPおよびDATETIMEカラムは自動的に初期化され、現在の日時(つまり、現在のタイムスタンプ)に更新されます。5.6.5より前では、これはTIMESTAMPにのみ当てはまり、テーブルごとに最大で1つのTIMESTAMP列に当てはまります。以下の注記では、最初にMySQL 5.6.5以降の自動初期化と更新について説明し、次に5.6.5より前のバージョンの違いについて説明します。
NO_ZERO_DATEに関する更新
MySQLの5.7.4以降、このモードは非推奨になりました。以前のバージョンでは、設定ファイルの該当する行をコメント化する必要があります。NO_ZERO_DATEのMySQL 5.7ドキュメントを参照してください
NULL
が目的です。