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

歡迎訪問 生活随笔!

生活随笔

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

数据库

mysql timestamp 插入null报错_读MySQL 5.7文档11.2 Date and Time Data Types总结

發布時間:2024/10/14 数据库 68 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql timestamp 插入null报错_读MySQL 5.7文档11.2 Date and Time Data Types总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:魏新平,知數堂第5期MySQL實戰班學員,第10期MySQL優化班學員,現任職助教。

讀MySQL5.7文檔11.2 Date and Time Data Types

MySQL的時間類型分為DATE, DATETIME, TIMESTAMP, TIME, YEAR五個類型。接下來為大家一一介紹下。

DATE類型

存儲YYYY-MM-DD類型的時間,取值范圍是'1000-01-01' to '9999-12-31'。

DATETIME和TIMESTAMP類型

兩個類型都是用來存儲YYYY-MM-DD hh:mm:ss[.fraction]格式的時間。不過在取值范圍和存儲方式上有些不同。

取值范圍

DATETIME的取值范圍是'1000-01-01 00:00:00' 到 '9999-12-31 23:59:59', TIMESTAMP的取值范圍是'1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC。可以看出來DATETIME的取值范圍大很多。

存儲方式

DATETIME是直接存儲插入的時間。而TIMESTAMP是將插入的值轉換為utc時間,然后存入數據庫,取出來的時候再根據當前會話的時區進行轉換顯示。

admin@localhost [weixinpingtest] 10:05:51>create table testtime(a timestamp,b datetime);

Query OK, 0 rows affected (0.05 sec)

admin@localhost [weixinpingtest] 10:07:20>insert into testtime() values(now(),now());

Query OK, 1 row affected (0.01 sec)

admin@localhost [weixinpingtest] 10:07:37>select * from testtime;

+---------------------+---------------------+

| a | b |

+---------------------+---------------------+

| 2020-03-04 10:07:37 | 2020-03-04 10:07:37 |

+---------------------+---------------------+

1 row in set (0.00 sec)

admin@localhost [weixinpingtest] 10:07:43>set timezone = '+9:00';#修改時區以后,下面顯示的時間就不一樣了

Query OK, 0 rows affected (0.00 sec)

admin@localhost [weixinpingtest] 10:07:50>select * from testtime;

+---------------------+---------------------+

| a | b |

+---------------------+---------------------+

| 2020-03-04 11:07:37 | 2020-03-04 10:07:37 |

+---------------------+---------------------+

1 row in set (0.00 sec)

可以看到只要修改時區,第二次查詢的時候,timestamp類型的字段時間多了一個小時,而datetime類型的字段時間沒有變化。

自動初始化和更新

雖然有點廢話,但是還是要介紹一下這兩個功能到底是什么作用。

自動初始化的關鍵字是DEFAULT CURRENT_TIMESTAMP。

CREATE TABLE t1 (

a int,

ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,

)

當往表t1中插入數據時,如果沒有指定ts的值,那么ts會被設置為當前時間。

自動更新的關鍵字是ON UPDATE CURRENT_TIMESTAMP

CREATE TABLE t1 (

a int,

ts TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

);

當表t1的a字段更新時,ts會自動更新到修改的時間。但是如果a修改的時候值沒有變化,那么ts也不會變化。

DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP可以同時指定,或者只指定其中一個。兩者的先后順序不會有什么影響。

explicit_defaults_for_timestamp變量

針對timestamp還有一個數據庫變量。explicit_defaults_for_timestamp。 這個變量默認是off的。那么off的時候會有什么現象呢。在創建表的時候,如果自動初始化和自動更新都沒有添加。那么第一個timestamp字段會自動加上DEFAULT CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP。

admin@localhost [weixinpingtest] 10:07:52>show global variables like '%explicitdefaultsfortimestamp%';

+---------------------------------+-------+

| Variablename | Value |

+---------------------------------+-------+

| explicitdefaultsfortimestamp | OFF |

+---------------------------------+-------+

1 row in set (0.00 sec)

admin@localhost [weixinpingtest] 10:15:14>create table testt3(a timestamp,b timestamp);

Query OK, 0 rows affected (0.02 sec)

admin@localhost [weixinpingtest] 10:15:44>show create table testt3;

+---------+------------------------------------------------------------------------------+

| Table | Create Table

+---------+------------------------------------------------------------------------------+

| testt3 | CREATE TABLE test_t3 (a timestamp NOT NULL DEFAULT CURRENTTIMESTAMP ON UPDATE CURRENT_TIMESTAMP,b timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |

1 row in set (0.00 sec)

有兩種方法可以阻止這種現象的發生,第一個是直接設定explicit_defaults_for_timestamp參數為on,第二個是給字段設置默認值,或者直接設置可以為可以為null。timestamp沒有指定允許null的情況下是不能插入null的,插入null的時候會默認轉換成當前時間

admin@localhost [weixinpingtest] 10:21:47>show create table testt4;

+---------+--------------------------------------------+

| Table | Create Table |

+---------+-------------------------------------------+

| test_t4 | CREATE TABLE test_t4 (a timestamp NULL DEFAULT NULL,b timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |

+---------+-------------------------------------------+

1 row in set (0.00 sec)

admin@localhost [weixinpingtest] 10:21:54>insert into testt4() values(null,null);

Query OK, 1 row affected (0.01 sec)

admin@localhost [weixinpingtest] 10:22:03>select * from testt4;

+------+---------------------+

| a | b |

+------+---------------------+

| NULL | 2020-03-05 10:22:03 |

+------+---------------------+

1 row in set (0.00 sec)

admin@localhost [weixinpingtest] 10:22:12>set explicitdefaultsfortimestamp=on;

Query OK, 0 rows affected (0.00 sec)

admin@localhost [weixinpingtest] 10:25:11>insert into testt4() values(null,null);

ERROR 1048 (23000): Column 'b' cannot be null

test_t4表當中a字段可以為null,b字段默認,不能為null,但是插入null值都沒有報錯,只不過a字段變成了null,b字段變成了當前時間。后面我開啟了explicit_defaults_for_timestamp,再次插入null,就報錯,說b不能為null了。

至于要不要開啟這個變量就看你自己了,反正是可以在線關閉和開啟的。

秒后面的小數

DATETIME和TIMESTAMP都是可以在定義字段類型時加上(n),比如DATETIME(3),這里的3表示秒后面的小數可以精確到幾位。n的取值范圍是0-6。如果不設定,默認是0。需要注意的是,當指定了初始化和自動更新時,后面的也要加上這個數字。而且必須保持一致。如下

admin@localhost [weixinpingtest] 10:34:53>CREATE TABLE testt5( ts TIMESTAMP(6) DEFAULT CURRENTTIMESTAMP(6) ON UPDATE CURRENTTIMESTAMP(6) );

Query OK, 0 rows affected (0.01 sec)

admin@localhost [weixinpingtest] 10:35:29>CREATE TABLE testt5( ts TIMESTAMP(6) DEFAULT CURRENTTIMESTAMP(6) ON UPDATE CURRENTTIMESTAMP(3) );

ERROR 1294 (HY000): Invalid ON UPDATE clause for 'ts' column

如果不一致就會報錯。

TIME類型

存儲hh:mm:ss類型的數據,取值范圍是'-838:59:59.000000' to '838:59:59.000000'。范圍可以取這么大的原因是time還可以表示時間差,所以范圍會大于24個小時,甚至是負數。TIME也是支持秒的小數的。

YEAR類型

存儲年份的。取值范圍是1901 - 2155 和 0000。

tips

針對DATE和DATETIME,表示的范圍非常大,但是mysql有一句提示語。For the DATE and DATETIME range descriptions, “supported” means that although earlier values might work, there is no guarantee.表示雖然支持那么大的時間范圍,但是我不保證這個能行。

喜歡文章的話就點個關注吧!

有問題聯系我,微信:lvqingshan_

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的mysql timestamp 插入null报错_读MySQL 5.7文档11.2 Date and Time Data Types总结的全部內容,希望文章能夠幫你解決所遇到的問題。

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