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