mysql 5.5と5.6バージョンtimestamp挿入nullと0の処理について

5249 ワード

Server version: 5.5.33-31.1-log Percona Server (GPL), Release rel31.1, Revision 566
mysql> CREATE TABLE `t1` (
`ID` int(11) NOT NULL DEFAULT ‘1‘,
`NAME` varchar(10) NOT NULL DEFAULT ‘‘,
`CREATE_TIME` timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00‘
) ENGINE=InnoDB DEFAULT CHARSET=utf8

mysql> select * from t1;
Empty set (0.00 sec)

mysql> insert into t1 (create_time) values (null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+----+------+---------------------+
| ID | NAME | CREATE_TIME |
+----+------+---------------------+
| 1 | | 2015-04-15 17:27:09 |
+----+------+---------------------+
1 row in set (0.00 sec)

上記の実験から見ると、5.533バージョンではcreate_timeはnot nullと定義されていますが、実際にはnullのみを挿入でき、自動的にcurrent_に変換されます.time.次に5.6の操作を見る:Server version:5.6.22-71.0-log Percona Server(GPL)、Release 71.0、Revision 726
mysql> CREATE TABLE `t1` (
`ID` int(11) NOT NULL DEFAULT1‘,
`NAME` varchar(10) NOT NULL DEFAULT ‘‘,
`CREATE_TIME` timestamp NOT NULL DEFAULT0000-00-00 00:00:00‘
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

mysql> select * from t1;
Empty set (0.00 sec)

mysql> insert into t1 (create_time) values (null);
ERROR 1048 (23000): Column ‘CREATE_TIME‘ cannot be null
mysql> select * from t1;
Empty set (0.00 sec)

直接エラーを報告し、ブロック文を挿入します.5.6ではこのBUGを解くためにパラメータをオンにする.以下は公式ドキュメントから抜粋した説明です
With explicit_defaults_for_timestamp enabled, inserting NULL into a TIMESTAMP NOT NULL column now produces an error (as it already did for other NOT NULL data types), instead of inserting the current timestamp. (Bug #68472, Bug #16394472)
したがって、timestampに挿入されたnullが現在の時間になるようにするにはexplicit_defaults_for_timestampをオフにする
SET GLOBAL explicit_defaults_for_timestamp = off;

データベースが厳格なモードである場合、STRICT_TRANS_TABLES.厳格モードでは、不正な日付、例えば'2004-04-31'は許可されません.日付に「ゼロ」セクションは使用できません.たとえば、「2004-04-00」または「ゼロ」日付などです.禁止するには、厳格なモードに基づいて、NO_ZERO_IN_DATEおよびNO_ZERO_DATE SQLモードを有効にする必要があります.
NO_ZERO_DATEは厳格なモードで、「0000-00-00」を合法的な日付にしないでください.IGNOREオプションでゼロ日付を挿入することもできます.非厳格モードでは、日付は受け入れられますが、警告が生成されます.
NO_ZERO_IN_DATEは厳格モードで、月または日部分が0の日付は受け付けません.IGNOREオプションを使用する場合は、類似の日付に'0000-00-00'を挿入します.非厳格モードでは、日付は受け入れられますが、警告が生成されます.
この2つのパラメータが設定されている場合、timestampに挿入された0は操作を拒否されます.2つのパラメータが設定されていない場合、timestampに挿入された0は'000-00-00 00 00:00'のデフォルト値になります.
5.6からtimestampのデフォルト動作はすでにdeprecatedです.
MySQL 5.6.6より前のTIMESTAMPのデフォルト動作:
TIMESTAMP列にNULL属性が明示的に宣言されていない場合、デフォルトはNOT NULLです.(他のデータ型では、NOT NULLとして宣言されていない場合はNULL値が許可されます.)TIMESTAMPのカラム値をNULLに設定すると、現在のtimestampとして自動的に格納されます.
表の最初のTIMESTAMP列は、NULL属性、DEFAULTまたはON UPDATEが宣言されていない場合、DEFAULT CURRENT_が自動的に割り当てられます.TIMESTAMPとON UPDATE CURRENT_TIMESTAMPプロパティ.
表の2番目のTIMESTAMP列は、NULLまたはDEFAULT句として宣言されていない場合、デフォルトでは「0000-00-00 00 00 00:00」が自動的に割り当てられます.行を挿入するときに変更された列の値は指定されず、デフォルトでは'0000-00-00 00:00'が割り当てられ、警告はありません.警告を閉じるには、次のパラメータを追加します.
explicit_defaults_for_timestamp=true

MySQLを再起動するとエラーが消え、TIMESTAMPの動作は以下の通りです.
TIMESTAMPは、NOT NULLが表示されていない場合、NULL値が許可されている場合は、デフォルトの充填動作ではなくNULLに変更することができます.TIMESTAMPはDEFAULT CURRENT_をデフォルトで割り当てませんTIMESTAMPとON UPDATE CURRENT_TIMESTAMPプロパティ.NOT NULLと宣言され、デフォルトの句がないTIMESTAMP列にはデフォルト値はありません.データテーブルに列を挿入し、TIMESTAMP列に値を付けなかった場合、厳格なSQLモードの場合、エラーが投げ出されます.厳格なSQLモードが有効になっていない場合、列は'0000-00-00 00:00'に値を付け、警告が表示されます.(これはMySQLが他の時間型データを処理しているのと同じです.DATETIMEのように)
つまりexplicit_defaults_for_timestampはtimestampタイプのフィールドロックが持つ奇妙なデフォルト動作を閉じ、このパラメータを追加した後、timestampタイプのフィールドにデフォルト動作を指定する必要がある場合は、テーブルの作成時に表示される指定を表示する必要があります.explicit_defaults_for_timestampとは、指定したデフォルト値がtimestampタイプのフィールドを表示することを意味します.