時間真的存在嗎?有觀點認(rèn)為,時間只是人類構(gòu)想出來的一種概念,是用來衡量事物變化的標(biāo)準(zhǔn)。對于數(shù)據(jù)庫來說時間伴隨著數(shù)據(jù)并進(jìn)。進(jìn)入MySQL時間漩渦中看看。
MySQL時間類型字段:
下面的容易忽略的內(nèi)容:
TIMESTAMP保存數(shù)據(jù)方式:
MySQL將TIMESTAMP值從當(dāng)前時區(qū)轉(zhuǎn)換為UTC進(jìn)行存儲,并從UTC返回到當(dāng)前時區(qū)進(jìn)行檢索。
(這不適用于其他類型,比如DATETIME。)默認(rèn)情況下,每個連接的當(dāng)前時區(qū)是服務(wù)器的時間。時區(qū)可以在每個連接的基礎(chǔ)上設(shè)置。只要時區(qū)設(shè)置保持不變,就會返回所存儲的相同值。如果存儲一個時間戳值,然后更改時區(qū)并檢索該值,則檢索到的值與存儲的值不同。出現(xiàn)這種情況是因為沒有在兩個方向上使用相同的時區(qū)進(jìn)行轉(zhuǎn)換。當(dāng)前時區(qū)可以作為time_zone系統(tǒng)變量的值。
TIMESTAMP和SQL_MODE組合
sql_mode也會影響timestamp值:
mysql> CREATE TABLE ts ( id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, col TIMESTAMP NOT NULL ) AUTO_INCREMENT = 1; mysql> SHOW VARIABLES LIKE '%sql_mode%'; +---------------+---------------------+ | Variable_name | Value | +---------------+---------------------+ | sql_mode | STRICT_TRANS_TABLES | +---------------+---------------------+ mysql> INSERT INTO ts (col) VALUES ('1969-01-01 01:01:10'); ERROR 1292 (22007): Incorrect datetime value: '1969-01-01 01:01:10' for column 'col' at row 1 mysql> SET sql_mode=""; Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE '%sql_mode%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | sql_mode | | +---------------+-------+ mysql> INSERT INTO ts (col) VALUES ('1969-01-01 01:01:10'),('2999-01-01 01:01:10'); Query OK, 2 rows affected, 2 warnings (0.01 sec) Records: 2 Duplicates: 0 Warnings: 2 mysql> show warnings; +---------+------+----------------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------------+ | Warning | 1264 | Out of range value for column 'col' at row 1 | | Warning | 1264 | Out of range value for column 'col' at row 2 | +---------+------+----------------------------------------------+ mysql> SELECT * FROM TS; +----+---------------------+ | id | col | +----+---------------------+ | 1 | 0000-00-00 00:00:00 | | 2 | 0000-00-00 00:00:00 | +----+---------------------+ 2 rows in set (0.00 sec)
通過控制sql_mode,超出timestamp限制值還是插入進(jìn)去了,但采用的是0填空方式。
對于STRICT_TRANS_TABLES, MySQL將一個無效的值轉(zhuǎn)換為最接近的有效值,然后插入調(diào)整后的值。如果缺少一個值,MySQL將為列數(shù)據(jù)類型插入隱式的默認(rèn)值。
默認(rèn)情況是啟用。
在MySQL 8.0.22中,如果試圖在聲明為TIMESTAMP NOT NULL的列中插入NULL,將會被拒絕,并產(chǎn)生錯誤。
1.explicit_defaults_for_timestamp被禁用時:
2.explicit_defaults_for_timestamp被啟用:
測試:
CREATE TABLE `test1`( id bigint not null AUTO_INCREMENT COMMENT '主鍵ID', name varchar(20) COMMENT '主鍵ID', create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'cr time', PRIMARY KEY(id) )ENGINE=InnoDB AUTO_INCREMENT=1 ; SHOW VARIABLES LIKE 'explicit_defaults_for_timestamp'; SET GLOBAL explicit_defaults_for_timestamp=ON; SET GLOBAL explicit_defaults_for_timestamp=OFF; INSERT INTO test1(id,name,create_time) VALUES(1,'Kit',NULL);
系統(tǒng)相關(guān)事件參數(shù)包含3個:
mysql>show global variables where Variable_name like '%time_zone%' or Variable_name like 'log_timestamp%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | CST | | time_zone | SYSTEM | | log_timestamps | UTC | +------------------+--------+ 3 rows in set (0.00 sec)
1.system time zone:當(dāng)服務(wù)器啟動時,它嘗試自動確定主機的時區(qū),并使用它來設(shè)置system_time_zone系統(tǒng)變量。此后該值不會改變。
2.time_zone:全time_zone表示服務(wù)器當(dāng)前運行的時區(qū)。初始的time_zone值為“SYSTEM”,表示服務(wù)器時區(qū)與系統(tǒng)時區(qū)一致。
備注:mysql還提供時區(qū)導(dǎo)入到mysql系統(tǒng)庫的方法。通過mysql_tzinfo_to_sql程序加載/usr/share/zoneinfom下的時區(qū)信息。
mysql> SELECT COUNT(*) FROM mysql.time_zone_name; +----------+ | COUNT(*) | +----------+ | 0 | +----------+
##mysql_tzinfo_to_sql工具導(dǎo)入時區(qū)值
shell>mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
mysql> SELECT COUNT(*) FROM mysql.time_zone_name; +----------+ | COUNT(*) | +----------+ | 1780 | +----------+
3.log_timestamps
這個變量控制寫入錯誤日志的消息以及寫入文件的一般查詢?nèi)罩竞吐俨樵內(nèi)罩鞠⒅械臅r間戳的時區(qū)。
它不會影響一般查詢?nèi)罩镜臅r區(qū)和慢速查詢?nèi)罩鞠懭氡?mysql。general_log mysql.slow_log)。
允許的log_timestamps值是UTC(默認(rèn)值)和SYSTEM(本地系統(tǒng)時區(qū))
備注:UTC一般指協(xié)調(diào)世界時。協(xié)調(diào)世界時,又稱世界統(tǒng)一時間、世界標(biāo)準(zhǔn)時間、國際協(xié)調(diào)時間,就是UTC+8小時=中國時間
當(dāng)然值 需要跟系統(tǒng)記錄時間一致,才能更好的管理。
#設(shè)置時區(qū),更改為東八區(qū) SET GLOBAL time_zone = '+8:00';
建議:
mysql配置文件my.cnf
[mysqld] log_timestamps=SYSTEM default-time_zone = '+8:00'
mysql>show global variables where Variable_name like '%time_zone%' or Variable_name like 'log_timestamp%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | log_timestamps | SYSTEM | | system_time_zone | CST | | time_zone | +08:00 | +------------------+--------+
從時間類型,參數(shù),系統(tǒng)時區(qū)了解到,MySQL里時間應(yīng)該怎樣設(shè)置和使用。
特別是無特殊要求sql_mode不要輕易改動。
到此這篇關(guān)于MySQL時間設(shè)置注意事項的文章就介紹到這了,更多相關(guān)MySQL時間設(shè)置注意內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:迪慶 南充 西寧 無錫 龍巖 徐州 自貢 麗水
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL時間設(shè)置注意事項的深入總結(jié)》,本文關(guān)鍵詞 MySQL,時間,設(shè)置,注意事項,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。