mysql timestamp 类型_MySQL中“诡异”的TIMESTAMP数据类型
注意:從5.6.4版本開始,TIME,TIMESTAMP,DATTIME這三種類型增加了對小數秒的支持,timestamp存儲大小為4Bytes+小數部分;datetime存儲大小為5Bytes+小數部分。詳見:
Date and Time Data Type Representation
#驗證了TIMESTAMP類型采用INT存儲,具體差8小時原因,請查看1:時區部分
mysql> SELECT FROM_UNIXTIME(0);
+---------------------+
| FROM_UNIXTIME(0) |
+---------------------+
| 1970-01-01 08:00:00 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT FROM_UNIXTIME(2147483647);
+---------------------------+
| FROM_UNIXTIME(2147483647) |
+---------------------------+
| 2038-01-19 11:14:07 |
+---------------------------+
1 row in set (0.00 sec)
相同點:
a、兩者都可以表示時間精確到秒且顯示格式都為:YYYY-MM-DD HH:MM:SS
不同點:
a、TIMESTAMP長度4字節而DATETIME長度8字節,比較節省存儲空間
b、TIMESTAMP類型采用INT存儲,排序效率更高,查詢速度更快,方便計算
c、TIMESTAMP有效范圍是1970-2038,而DATETIME有效范圍是1000-9999
d、TIMESTAMP類型有默認行為,而DATETIME則沒有
e、TIMESTAMP類型會受時區的影響,而DATETIME則不會(
見案例六)
f、TIMESTAMP類型會受SQL_MODE的影響,而DATETIME則不會
4:TIMESTAMP類型的默認行為
4.1:默認行為規則如下:
a、如果TIMESTAMP列沒有明確聲明NULL屬性,則默認是NOT NULL(如果是其他的數據類型,如果沒有明確聲明NULL屬性則默認為NULL)
b、表中的第一個TIMESTAMP字段,如果沒有明確聲明NULL、DEFAULT、ON UPDATE會自動分配DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP屬性(
見案例一)
c、表中的第二個及以后TIMESTAMP字段,如果沒有明確聲明NULL、DEFAULT會默認分配'0000-00-00 00:00:00'屬性(
見案例二)
4.2:使用規則如下:
a、在INSERT或者UPDATE語句中設置了TIMESTAMP字段為NULL時,若該字段允許為NULL,則結果為NULL;若該字段不允許為NULL,則結果為當前的時間戳,
跟DEFAULT沒有關系(
見案例四)
b、在INSERT時若缺省(即INSERT語句不指定該列的值),則結果為默認值,具體值由DEFAULT決定(
見案例五)
c、若有一個字段屬性是ON UPDATE CURRENT_TIMESTAMP,則修改該行的任何字段都會更新此TIMESTAMP字段為當前時間戳。
4.3:默認行為的特殊限制
a、5.1和5.5版本每張表只能有一個DEFAULT CURRENT_TIMESTAMP類型的TIMESTAMP字段,如果多了會報錯:there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause(
見案例三)
b、5.6和5.7則沒有這個限制:每張表可以由多個DEFAULT CURRENT_TIMESTAMP類型的TIMESTAMP字段
c、參數explicit_defaults_for_timestamp(釋義:顯示指定TIMESTAMP類型)可以控制TIMESTAMP類型的默認行為,默認是OFF,即使用默認行為,不手動顯示指定
4.4:案例篇
默認行為規則+使用規則+特殊限制放在一起暈了沒?我們少廢話,上案例
a、案例一:
驗證了4.1-b的默認行為
mysql> #執行SQL
mysql> CREATE TABLE tab(
-> id BIGINT unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,-> db_create_time TIMESTAMP-> )ENGINE=INNODB DEFAULT CHARSET=UTF8;
Query OK, 0 rows affected (0.01 sec)
mysql> #SHOW CREATE TABLE查看
mysql> #5.5版本 & 5.6版本 & 5.7版本
mysql> SHOW CREATE TABLE tab\G
*************************** 1. row ***************************
Table: tab
Create Table: CREATE TABLE `tab` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`db_create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
b、案例二:
驗證了4.1-bc的默認行為
mysql> #執行SQL
mysql> CREATE TABLE tab1(
-> id BIGINT unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,-> db_create_time TIMESTAMP,-> db_update_time TIMESTAMP-> )ENGINE=INNODB DEFAULT CHARSET=UTF8;
Query OK, 0 rows affected (0.01 sec)
mysql> #SHOW CREATE TABLE查看
mysql> #5.5版本 & 5.6版本 & 5.7版本
mysql> SHOW CREATE TABLE tab1 \G
*************************** 1. row ***************************
Table: tab1
Create Table: CREATE TABLE `tab1` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`db_create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`db_update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
c、案例三:
驗證了4.3-a的特殊限制
mysql> #執行SQL
mysql>CREATE TABLE tab2(
-> id BIGINT unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,-> db_create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,-> db_update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP-> )ENGINE=INNODB DEFAULT CHARSET=UTF8;Query OK, 0 rows affected (0.01 sec)
mysql> #SHOW CREATE TABLE查看
mysql> #5.6版本 & 5.7版本
mysql> SHOW CREATE TABLE tab2 \G
*************************** 1. row ***************************
Table: tab2
Create Table: CREATE TABLE `tab2` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`db_create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`db_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
#5.5版本報錯了(MySQL5.5版本不支持多個DEFAULT CURRENT_TIMESTAMP屬性的字段)
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
d、案例四:
驗證了4.2-a的使用規則
#5.5版本 & 5.6版本 & 5.7版本
mysql> #執行SQL
mysql> CREATE TABLE tab3(
-> id BIGINT unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-> db_create_time TIMESTAMP NOT NULL DEFAULT '2000-01-01 00:00:00'
-> )ENGINE=INNODB DEFAULT CHARSET=UTF8;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW CREATE TABLE tab3 \G
*************************** 1. row ***************************
Table: tab3
Create Table: CREATE TABLE `tab3` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`db_create_time` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)mysql> INSERT INTO tab3 VALUES(1,NULL);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM tab3;
+----+---------------------+
| id | db_create_time |
+----+---------------------+
| 1 | 2017-06-29 22:46:53 |
+----+---------------------+
1 row in set (0.01 sec)
本文來自網易實踐者社區,經作者葛崇授權發布。
總結
以上是生活随笔為你收集整理的mysql timestamp 类型_MySQL中“诡异”的TIMESTAMP数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hive substr函数_数据分析工具
- 下一篇: mysql过程异常处理_mysql数据库