MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 2439|回复: 3
打印 上一主题 下一主题

坑爹的now()函数

[复制链接]
跳转到指定楼层
1#
发表于 2014-11-19 11:55:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前两天,接到一部门的需求,通过文件导入的方式将一批数据录入到MySQL中。
结果发现数据库记录的操作时间和录入的时间相差8个小时,录入时间是通过now()函数进行的。

检查了好半天,发现文件头部包含有对时区的设置。
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;



而在中国,系统的时区一般是东八区(+0800)。
db-linux1:~ # date -R
Wed, 19 Nov 2014 11:50:37 +0800



如果使用非+0800时区设置数据库变量,会影响到MySQL的一些时间函数的结果,如now()。

我们可以测试一下,

mysql> select now();  //设置时区前
+---------------------+
| now()               |
+---------------------+
| 2014-11-19 11:37:39 |
+---------------------+
1 row in set (0.00 sec)

mysql> set @OLD_TIME_ZONE=@@TIME_ZONE;
Query OK, 0 rows affected (0.00 sec)

mysql> SET TIME_ZONE='+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select now();  //设置时区后
+---------------------+
| now()               |
+---------------------+
| 2014-11-19 03:37:57 |
+---------------------+
1 row in set (0.00 sec)



细节决定成败,路还很长,细心最重要。





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶1 踩
匿名
2#
匿名  发表于 2014-11-19 16:35:27
{:soso_e179:}总结的很好。
3#
发表于 2014-11-26 21:24:11 | 只看该作者
mysql的TIME_ZONE默认与主机操作系统的TIME ZONE设置是相同的,因此只要确保所有主机上的时区设置是正确的,一般应该不会出现这种问题吧
4#
发表于 2014-11-26 22:07:37 | 只看该作者
本帖最后由 hailerer 于 2014-11-26 22:13 编辑

之前理解有误,参见下面指引,默认情况下mysqldump在导出和导入数据时会把TIME_ZONE先设置为'+00:00',但在导完数据后再把TIME_ZONE改回去(即用OLD_TIME_ZONE覆盖回TIME_ZONE),并且全过程修改的环境变量只是自身session的环境变量,不会影响到全局参数,所以理论上对数据库的其他用户应该是没有感知的。

--tz-utc

This option enables TIMESTAMP columns to be dumped and reloaded between servers in different time zones. mysqldump sets its connection time zone to UTC and adds SET TIME_ZONE='+00:00' to the dump file. Without this option, TIMESTAMP columns are dumped and reloaded in the time zones local to the source and destination servers, which can cause the values to change if the servers are in different time zones. --tz-utc also protects against changes due to daylight saving time. --tz-utc is enabled by default. To disable it, use --skip-tz-utc. This option was added in MySQL 5.1.2.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-5-4 01:20 , Processed in 0.065436 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表