亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL時間類型和模式詳情

 更新時間:2021年09月26日 10:45:44   作者:趙帥強(qiáng)  
這篇文章主要介紹MySQL時間類型和模式 MySQL會在存儲時將數(shù)據(jù)值轉(zhuǎn)換為UTC標(biāo)準(zhǔn)時間來存儲,讀取時再轉(zhuǎn)為當(dāng)前時間。如果你的時區(qū)沒有發(fā)生改變,則該值就是你存儲的值,如果你改變了時區(qū),讀取到的值就會發(fā)生變化。這個特性不會對DATETIME生效,需要的朋友可以參考一下

當(dāng)我在MySQL數(shù)據(jù)庫中嘗試插入一條帶有時間戳的數(shù)據(jù)時報錯:

mysql> insert into alarm_service values (6, '1970-01-01 08:00:00'); 
ERROR 1292 (22007): Incorrect datetime value: '1970-01-01 08:00:00' for column 'time' at row 1

# 查看表結(jié)構(gòu)
mysql> show create table alarm_service;
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table         | Create Table                                                                                                                                                                                                                         |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| alarm_service | CREATE TABLE `alarm_service` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

我們可以發(fā)現(xiàn)錯誤信息提示是時間值錯誤,但是我們這明顯是一個合法的時間點啊。

經(jīng)過查詢資料,發(fā)現(xiàn)原因是在MySQL中,timestamp類型的合法區(qū)間是1970-01-01 00:00:01 - 2038-01-19 03:14:07 UTC,而在存儲是,會先將你插入的數(shù)據(jù)轉(zhuǎn)換為UTC時間,然后存儲起來,讀取的時候,再轉(zhuǎn)換為你的本地時間。由于我的時區(qū)為東八區(qū),因此轉(zhuǎn)換后就變?yōu)榱?code>1970-01-01 00:00:00 UTC,成為了非法時間。

解決方案為:

  1. 調(diào)整時間為合法范圍
  2. 調(diào)整MySQL嚴(yán)格模式,允許非法時間

下面我們詳細(xì)說明相關(guān)的內(nèi)容。

1、MySQL時間類型

MySQL時間類型分為三種:

  • DATE:用于只包含日期不包含時間的時候,MySQL會將格式轉(zhuǎn)換為YYYY-MM-DD,合法范圍為1000-01-01 - 9999-12-31。
  • DATETIME:用于包含日期+時間的時候,格式為YYYY-MM-DD HH:MM:SS,合法范圍為1000-01-01 00:00:00 - 9999-12-31 23:59:59。
  • TIMESTAMP:用于包含日期+時間的時候,格式為YYYY-MM-DD HH:MM:SS,合法范圍為1997-01-01 00:00:01 - 2038-01-19 03:14:07 UTC。

同時,DATETIMETIMESTAMP還都支持一個6位微秒的數(shù)據(jù)支持,格式為YYYY-MM-DD HH:MM:SS[.fraction] ,合法范圍為.000000 - .999999。

DATETIMETIMESTAMP還都提供自動初始化并更新為當(dāng)前日期和時間的數(shù)據(jù)。

對于TIMESTAMP類型,MySQL會在存儲時將數(shù)據(jù)值轉(zhuǎn)換為UTC標(biāo)準(zhǔn)時間來存儲,讀取時再轉(zhuǎn)為當(dāng)前時間。如果你的時區(qū)沒有發(fā)生改變,則該值就是你存儲的值,如果你改變了時區(qū),讀取到的值就會發(fā)生變化。這個特性不會對DATETIME生效。

2、查看時區(qū)

mysql> show variables like '%zone%';                                       
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
+------------------+--------+


可以看到當(dāng)前設(shè)置的時區(qū)是SYSTEM,即跟操作系統(tǒng)保持一致,同時系統(tǒng)的時區(qū)是CST(China Standard Time 北京標(biāo)準(zhǔn)時間),查看系統(tǒng)時間也可以看到是東8區(qū)(+0800):

$ date -R
Tue, 23 Apr 2019 11:22:47 +0800


因此我們輸入1970-01-01 08:00:00MySQL會糾正為1970-01-01 00:00:00,而成為一個非法值。

3、非法時間值

對于非法的時間值,針對不同的時間類型,MySQL會將其轉(zhuǎn)為合適的值:0000-00-00 0000-00-00 00:00:00。

比如月份為1-12月,當(dāng)你嘗試插入2019-13-01 00:00:00時,就會被糾正為0000-00-00 00:00:00,因為不存在13月,為非法值。

4、嚴(yán)格模式

當(dāng)我們插入非法時間值時,雖然會被糾正,但是在嚴(yán)格模式下,不會插入數(shù)據(jù),反而會報錯:

ERROR 1292 (22007): Incorrect datetime value: '1970-01-01 08:00:00' for column 'time' at row 1


我們可以通過設(shè)置模式,來調(diào)整MySQL的行為,首先查看MySQL的模式:

mysql> show variables like '%sql_mode%';            
+----------------------------+--------------------------------------------+
| Variable_name              | Value                                      |
+----------------------------+--------------------------------------------+                               |
| sql_mode                   | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+----------------------------+--------------------------------------------+


在這個模式下,非法時間會直接報錯,我們可以調(diào)整模式為ALLOW_INVALID_DATES

mysql> set session sql_mode = 'ALLOW_INVALID_DATES';
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%sql_mode%';            
+---------------+---------------------+
| Variable_name | Value               |
+---------------+---------------------+
| sql_mode      | ALLOW_INVALID_DATES |
+---------------+---------------------+
1 row in set (0.00 sec)

在這個模式下,不會再完備檢查日期的合法性,只會檢查月份的范圍在1-12,日期在1-31。這在處理用戶輸入的時候很合適,但是這個模式只對于DATEDATETIME很合適,對于TIMESTAMP,依然需要一個合法的值,否則就會糾正為0000-00-00 00:00:00。

在非法值時,如果這個模式啟用,就會報錯;如果禁用,就會糾正為0000-00-00 00:00:00并產(chǎn)生一個警告:

mysql> insert into alarm_service values (7, '1970-01-01 08:00:00'); 
Query OK, 1 row affected, 1 warning (0.00 sec)

總結(jié):

對于這種問題,有兩種解決方法:

  1. 調(diào)整時間為合法范圍
  2. 調(diào)整MySQL嚴(yán)格模式,允許非法時間

5、case匯總

ERROR 1067 (42000): Invalid default value for 'createTime'

查看原因發(fā)現(xiàn)設(shè)置為:

# 查看創(chuàng)建表單的語句
CREATE TABLE `dimensionsConf` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `createTime` datetime DEFAULT CURRENT_TIMESTAMP,
) ENGINE=InnoDB AUTO_INCREMENT=178 DEFAULT CHARSET=utf8;

# 查看數(shù)據(jù)庫版本
$mysql --version
mysql  Ver 14.14 Distrib 5.1.30, for unknown-linux-gnu (x86_64) using  EditLine wrapper

到此這篇關(guān)于MySQL時間類型和模式詳情的文章就介紹到這了,更多相關(guān)MySQL時間類型和模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL中幾種插入和批量語句實例詳解

    MySQL中幾種插入和批量語句實例詳解

    這篇文章主要給大家介紹了關(guān)于MySQL中幾種插入和批量語句的相關(guān)資料,在mysql數(shù)據(jù)庫中,實現(xiàn)批量插入數(shù)據(jù)與批量更新數(shù)據(jù)的例子,即批量insert、update的方法,需要的朋友可以參考下
    2021-09-09
  • mysql 5.7.13 解壓縮版(免安裝)安裝配置教程

    mysql 5.7.13 解壓縮版(免安裝)安裝配置教程

    這篇文章主要介紹了MySQL 5.7.13 for Windows解壓縮版(免安裝)安裝配置教程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • mysql 5.7.11 winx64安裝配置教程

    mysql 5.7.11 winx64安裝配置教程

    這篇文章主要介紹了mysql 5.7.11 winx64安裝配置教程,介紹了MySQL5.7安裝及初始化,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 深入探索數(shù)據(jù)庫MySQL性能優(yōu)化與復(fù)雜查詢相關(guān)操作

    深入探索數(shù)據(jù)庫MySQL性能優(yōu)化與復(fù)雜查詢相關(guān)操作

    數(shù)據(jù)庫MySQL 是一種開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在進(jìn)行 MySQL 數(shù)據(jù)庫開發(fā)過程中,需要深入了解如何進(jìn)行性能優(yōu)化和復(fù)雜查詢,以提高系統(tǒng)的效率和可靠性,本文介紹的非常詳細(xì),需要的朋友可以參考一下
    2023-04-04
  • 一篇文章帶你了解MySQL數(shù)據(jù)庫約束

    一篇文章帶你了解MySQL數(shù)據(jù)庫約束

    數(shù)據(jù)庫中要管理很多數(shù)據(jù),但是這些數(shù)據(jù)是否正確、是否非法,光靠人力來檢驗是遠(yuǎn)遠(yuǎn)不夠的,因此我們想讓數(shù)據(jù)庫擁有豐富的檢驗和校驗?zāi)芰?所以便引入了約束,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫約束的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • 在centOS 7安裝mysql 5.7的詳細(xì)教程

    在centOS 7安裝mysql 5.7的詳細(xì)教程

    這篇文章主要介紹了在centOS 7安裝mysql 5.7的詳細(xì)教程,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2016-12-12
  • MySQL報錯:Starting MySQL ERROR! Couldn‘t find MySQL server (/usr/local/mysql/bin/mysqld_safe)

    MySQL報錯:Starting MySQL ERROR! Couldn‘t f

    本文主要介紹了MySQL報錯:Starting MySQL ERROR! Couldn‘t find MySQL server (/usr/local/mysql/bin/mysqld_safe)
    2024-03-03
  • mysql分表程序改動方法

    mysql分表程序改動方法

    在本篇文章里小編給大家分享了關(guān)于mysql分表程序改動方法以及相關(guān)知識點,需要的朋友們跟著學(xué)習(xí)下。
    2019-04-04
  • Mysql刪除重復(fù)數(shù)據(jù)通用SQL的兩種方法

    Mysql刪除重復(fù)數(shù)據(jù)通用SQL的兩種方法

    本文主要介紹了Mysql刪除重復(fù)數(shù)據(jù)通用SQL的兩種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • InnoDB的關(guān)鍵特性-插入緩存,兩次寫,自適應(yīng)hash索引詳解

    InnoDB的關(guān)鍵特性-插入緩存,兩次寫,自適應(yīng)hash索引詳解

    下面小編就為大家?guī)硪黄狪nnoDB的關(guān)鍵特性-插入緩存,兩次寫,自適應(yīng)hash索引詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03

最新評論