mysql now()函數(shù)調(diào)用系統(tǒng)時(shí)間不對(duì)的解決方法
今天在MySQL的Now函數(shù)上踩了兩個(gè)坑,花了不少時(shí)間。
向數(shù)據(jù)庫(kù)寫記錄最好用不用客戶端時(shí)間
第一個(gè)坑是客戶端、服務(wù)器的系統(tǒng)時(shí)間不一致。
在執(zhí)行依賴時(shí)間的SQL查詢的時(shí)候,使用了客戶端本地的時(shí)間格式,客戶端程序返回當(dāng)前時(shí)間是:‘7/18/2022 10:02:43’,然而MYSQL就不能正確識(shí)別了,也沒(méi)有報(bào)錯(cuò),導(dǎo)致這個(gè)這個(gè)錯(cuò)誤隱藏了很久才被發(fā)現(xiàn)。
實(shí)際上,如果給出的時(shí)間格式是這樣:‘2022/7/18 10:02:43’,就會(huì)返回預(yù)期的結(jié)果。猜想這次運(yùn)行客戶端程序的服務(wù)器雖然也是中文版,但是內(nèi)核應(yīng)該是英文版的,因此系統(tǒng)默認(rèn)的時(shí)間格式和我們常見的不同,于是MySQL把它認(rèn)作是。。。(一個(gè)古怪的時(shí)間去了)
解決辦法
盡可能不使用客戶端的時(shí)間,不準(zhǔn)確還有時(shí)區(qū)問(wèn)題,用MySQL服務(wù)器端時(shí)間Now()來(lái)進(jìn)行查詢和保存記錄。
MySQL服務(wù)器時(shí)區(qū)不等于東八區(qū)的問(wèn)題
這次遇到的MySQL的版本默認(rèn)的時(shí)區(qū)是UTC,也就是標(biāo)準(zhǔn)時(shí)間。如果數(shù)據(jù)記錄的時(shí)間是北京時(shí)間,也就是東八區(qū)的時(shí)間,那么MySQL的Now函數(shù)返回的時(shí)間和數(shù)據(jù)記錄的時(shí)間相差了八個(gè)小時(shí)。
查詢MySQL時(shí)區(qū):
mysql> show variables like "%time_zone%"; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | UTC | | time_zone | SYSTEM | +------------------+--------+
設(shè)置MySQL時(shí)間為北京時(shí)間
mysql> set global time_zone = '+8:00'; Query OK, 0 rows affected mysql> set time_zone = '+8:00'; Query OK, 0 rows affected mysql> flush privileges;? Query OK, 0 rows affected
再查詢下MySQL時(shí)區(qū),驗(yàn)證下Now返回了北京時(shí)間
mysql> show variables like "%time_zone%"; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | UTC | | time_zone | +08:00 | +------------------+--------+ mysql> SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2022-07-19 18:57:35 | +---------------------+ 1 row in set
MySQL時(shí)區(qū)的設(shè)置和Docker有關(guān)
這里說(shuō)下花了我大量時(shí)間的坑,也就是這個(gè)服務(wù)器的MySQL是通過(guò)Docker安裝的,我就懶得去修改MySQL的配置文件了,而配置文件里沒(méi)有配置默認(rèn)時(shí)區(qū)。
理論上,MySQL就會(huì)應(yīng)用本地服務(wù)器的時(shí)區(qū),而本地服務(wù)器的時(shí)區(qū)已經(jīng)設(shè)置成東八區(qū)了,在系統(tǒng)控制臺(tái)我能看到返回的當(dāng)前時(shí)間是北京時(shí)間了。
問(wèn)題就在于上面這個(gè)“理論”不靠譜,不是的,MySQL依然是返回UTC時(shí)間。
我記憶的這個(gè)“理論”應(yīng)該是有問(wèn)題的,但沒(méi)有搞清楚具體問(wèn)題是什么,懷疑是和Dockers有關(guān),如果是直接安裝的MySQL在不配置默認(rèn)時(shí)區(qū)時(shí)似乎沒(méi)有遇到這個(gè)問(wèn)題。
解決辦法:
結(jié)論是不管如何,還是手動(dòng)在設(shè)置下系統(tǒng)的時(shí)區(qū)吧!或者在寫MySQL的配置文件時(shí),增加如下一個(gè)配置,然后才能使用Now()函數(shù)。
修改my.cnf文件,加入如下1行:
default-time-zone='+08:00' # 數(shù)據(jù)表默認(rèn)時(shí)區(qū)
如果是中途 修改,需要重啟Docker,不能偷懶。
到此這篇關(guān)于MySQL now函數(shù)使用的坑的文章就介紹到這了,更多相關(guān)MySQL now內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL窗口函數(shù)OVER使用示例詳細(xì)講解
這篇文章主要介紹了MySQL窗口函數(shù)OVER()用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01在MySQL中如何存取List<String>數(shù)據(jù)
這篇文章主要介紹了在MySQL中如何存取List<String>數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Linux系統(tǒng)每日定時(shí)備份mysql數(shù)據(jù)的方法步驟
這篇文章主要介紹了Linux系統(tǒng)每日定時(shí)備份mysql數(shù)據(jù)的方法步驟,包括創(chuàng)建文件夾、編寫腳本、設(shè)置定時(shí)任務(wù)和測(cè)試腳本,詳細(xì)步驟涵蓋從文件夾創(chuàng)建到腳本執(zhí)行的全過(guò)程,幫助用戶實(shí)現(xiàn)數(shù)據(jù)庫(kù)的自動(dòng)備份,需要的朋友可以參考下2024-11-11MySql中使用INSERT INTO語(yǔ)句更新多條數(shù)據(jù)的例子
這篇文章主要介紹了MySql中使用INSERT INTO語(yǔ)句更新多條數(shù)據(jù)的例子,MySQL的特有語(yǔ)法,需要的朋友可以參考下2014-06-06mysql設(shè)置指定ip遠(yuǎn)程訪問(wèn)連接實(shí)例
這篇文章主要介紹了mysql設(shè)置指定ip遠(yuǎn)程訪問(wèn)連接的方法,分別實(shí)例講述了從任意主機(jī)和指定ip訪問(wèn)遠(yuǎn)程MySQL數(shù)據(jù)庫(kù)的方法,代碼簡(jiǎn)單功能實(shí)用,需要的朋友可以參考下2014-10-10