mysql now()函数调用系统时间不对的解决方法

 更新时间:2023年05月24日 11:25:17   作者:五角大寨  
mysql的now()函数与实际时间不符,本文就详细的介绍一下mysql now()函数调用系统时间不对的解决方法,非常具有实用价值,需要的朋友可以参考下

今天在MySQL的Now函数上踩了两个坑,花了不少时间。

向数据库写记录最好用不用客户端时间

第一个坑是客户端、服务器的系统时间不一致。

在执行依赖时间的SQL查询的时候,使用了客户端本地的时间格式,客户端程序返回当前时间是:‘7/18/2022 10:02:43’,然而MYSQL就不能正确识别了,也没有报错,导致这个这个错误隐藏了很久才被发现。

实际上,如果给出的时间格式是这样:‘2022/7/18 10:02:43’,就会返回预期的结果。猜想这次运行客户端程序的服务器虽然也是中文版,但是内核应该是英文版的,因此系统默认的时间格式和我们常见的不同,于是MySQL把它认作是。。。(一个古怪的时间去了)

解决办法

尽可能不使用客户端的时间,不准确还有时区问题,用MySQL服务器端时间Now()来进行查询和保存记录。

MySQL服务器时区不等于东八区的问题

这次遇到的MySQL的版本默认的时区是UTC,也就是标准时间。如果数据记录的时间是北京时间,也就是东八区的时间,那么MySQL的Now函数返回的时间和数据记录的时间相差了八个小时。

查询MySQL时区:

mysql> show variables like "%time_zone%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | SYSTEM |
+------------------+--------+

设置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时区,验证下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时区的设置和Docker有关

这里说下花了我大量时间的坑,也就是这个服务器的MySQL是通过Docker安装的,我就懒得去修改MySQL的配置文件了,而配置文件里没有配置默认时区。

理论上,MySQL就会应用本地服务器的时区,而本地服务器的时区已经设置成东八区了,在系统控制台我能看到返回的当前时间是北京时间了。

问题就在于上面这个“理论”不靠谱,不是的,MySQL依然是返回UTC时间。

我记忆的这个“理论”应该是有问题的,但没有搞清楚具体问题是什么,怀疑是和Dockers有关,如果是直接安装的MySQL在不配置默认时区时似乎没有遇到这个问题。

解决办法:

结论是不管如何,还是手动在设置下系统的时区吧!或者在写MySQL的配置文件时,增加如下一个配置,然后才能使用Now()函数。

修改my.cnf文件,加入如下1行:

default-time-zone='+08:00' # 数据表默认时区

如果是中途 修改,需要重启Docker,不能偷懒。

到此这篇关于MySQL now函数使用的坑的文章就介绍到这了,更多相关MySQL now内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Access数据库的存储上限

    Access数据库的存储上限

    Access数据库的存储上限...
    2006-09-09
  • MySQL中列转行和行转列总结解决思路

    MySQL中列转行和行转列总结解决思路

    最近工作中用到了好几次列转行,索性做个小总结,下面这篇文章主要给大家介绍了关于MYSQL如何列转行的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • MySQL如何优雅的备份账号相关信息

    MySQL如何优雅的备份账号相关信息

    这篇文章主要介绍了MySQL如何优雅的备份账号相关信息,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下
    2020-08-08
  • MySQL Innodb关键特性之插入缓冲(insert buffer)

    MySQL Innodb关键特性之插入缓冲(insert buffer)

    这篇文章主要介绍了MySQL Innodb关键特性之插入缓冲的相关资料,帮助大家更好的理解和学习使用Innodb存储引擎,感兴趣的朋友可以了解下
    2021-04-04
  • 关于MySQL索引的深入解析

    关于MySQL索引的深入解析

    这篇文章主要给大家介绍了关于MySQL索引的深入解析,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • mysql配置文件的使用教程

    mysql配置文件的使用教程

    这篇文章主要介绍了mysql配置文件的使用教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-10-10
  • MySQL索引命中与失效代码实现

    MySQL索引命中与失效代码实现

    这篇文章主要介绍了MySQL索引命中与失效代码实现,文章内容详细,简单易懂,需要的朋友可以参考下
    2023-01-01
  • MySQL错误ERROR 2002 (HY000): Can''t connect to local MySQL server through socket

    MySQL错误ERROR 2002 (HY000): Can''t connect to local MySQL ser

    这篇文章主要介绍了MySQL错误ERROR 2002 (HY000): Can't connect to local MySQL server through socket,需要的朋友可以参考下
    2014-10-10
  • phplib中的一些基本语法和函数

    phplib中的一些基本语法和函数

    phplib中常用的方法有set_file,set_block,set_var,parse,ppasre,p,get等。
    2010-04-04
  • 一文读懂MySQL 表分区

    一文读懂MySQL 表分区

    MySQL自带了分区功能,我们可以创建一个带有分区的表,而且不需要借助任何外部工具,本文主要了介绍了MySQL表分区,具有一定的参考价值,感兴趣的小伙伴们可以参考一下<BR>
    2022-03-03

最新评论