sql >> データベース >  >> RDS >> Mysql

DATEまたはDATETIMEのデフォルト値を設定する際のMySQLのエラー

    エラーは、最新のMYSQL5.7ドキュメントに従って厳密モードになり得るSQLモードが原因です

    MySQLDocumentation5.7によると> :

    厳密モードは、サーバーが有効な日付として「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()に関する別の関連するバグレポートがあります。 関数

    日時フィールドはデフォルトの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のドキュメント を参照してください。



    1. Group_Concat()がSQLiteでどのように機能するか

    2. dBaseサポートがMicrosoftAccessに戻ってきました!

    3. Oracleの「PartitionBy」および「Row_Number」キーワード

    4. ダイナミックサンプリング12cで私を殺す