エラーは、最新のMYSQL5.7ドキュメントに従って厳密モードになり得るSQLモードが原因です
厳密モードは、サーバーが有効な日付として「0000-00-00」を許可するかどうかに影響します:厳密モードが有効になっていない場合、「0000-00-00」が許可され、挿入は警告を生成しません。厳密モードが有効になっている場合、「0000- 00-00'は許可されておらず、IGNOREも指定されていない限り、挿入によってエラーが発生します。 INSERTIGNOREおよびUPDATEIGNOREの場合、「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
で実行する必要があります ファイル。
注
ただし、MYSQL5.6ではデフォルトで厳密モードは有効になっていません。したがって、のようにエラーは発生しません。 MYSQL6のドキュメント
MySQLでは、「0000-00-00」の「ゼロ」値を「ダミーの日付」として保存できます。これは、NULL値を使用するよりも便利な場合があり、使用するデータとインデックススペースが少なくなります。 '0000-00-00'を禁止するには、NO_ZERO_DATESQLモードを有効にします。
更新
@ Dylan-Suが言ったバグの問題について:
これは、MYSQLが時間の経過とともに進化する方法のバグではないと思います。これにより、製品のさらなる改善に基づいていくつかの変更が加えられます。
ただし、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に関する更新
5.7.4以降のMySQLでは、このモードは非推奨です。以前のバージョンでは、構成ファイルのそれぞれの行をコメントアウトする必要があります。 NO_ZERO_DATEに関するMySQL5.7のドキュメント を参照してください。