日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql timestamp 类型_MySQL中“诡异”的TIMESTAMP数据类型

發布時間:2025/3/20 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。