MYSQL的NOW和SYSDATE函数的区别
在MySQL Performance Blog博客上看到一篇文章介绍now()和sysdate()函数。
想起很多朋友专门问在MySQL里面提供now()和sysdate()函数,都是表示取得当前时间,他们之间有什么区别。我们下面来详细看一下
首先大家可以看一下下面的一个诡异现象:
| 1 2 3 4 5 6 7 | mysql> SELECT NOW(),SYSDATE(); +---------------------+---------------------+ | NOW() | SYSDATE() | +-----------------------------+----------------------------+ | 1999-01-01 00:00:00 | 2012-12-05 09:50:03 | +---------------------------+----------------------------+ 1 row in set (0.00 sec) | 
很有意思吧?
sysdate()得到的时间是当前时间,而now()取出来的时间竟然是“1999-01-01 00:00:00”。
首先申明,我不是PS或者修改得来的,你看完本文,我会教你在你的MySQL上也得出这样的结果。
另外我们看一下,now()和sysdate()的另外一个区别:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | mysql> SELECT NOW(), SLEEP(2), NOW(); +---------------------+----------+---------------------+ | NOW() | SLEEP(2) | NOW( | +-----------------------------+--------------+-----------------------------+ | 2006-04-12 13:47:36 | 0 | 2006-04-12 13:47:36 | +---------------------------+--------------+----------------------------+ mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE(); +---------------------+----------+---------------------+ | SYSDATE() | SLEEP(2) | SYSDATE() | +-----------------------------+--------------+----------------------------+ | 2006-04-12 13:47:44 | 0 | 2006-04-12 13:47:46 | +---------------------------+--------------+----------------------------+ | 
在使用now()的情况下,虽然我们sleep了2秒,但是大家可以看到两次now()函数输出的结果都是’2006-04-12 13:47:36′
而使用sysdate()的情况下,是两个时间’2006-04-12 13:47:44′,’2006-04-12 13:47:46’,正好相差两秒。
这个最终的原因,大家可以直接查看MySQL的reference对now()函数的解释:http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_now
我简单给大家翻译一下。
now()函数,返回的是当前的时间。但是当前的时间是怎么取的列?
首先,对于now()函数来说,它取的时间是语句开始执行的那个时间,并且在语句执行过程中,这个值都不会变。甚至于,你在执行一个存储过程或者触发器时,这个值都是一直不变的。
这也就解释了,为什么sleep了2秒以后,在SELECT NOW(), SLEEP(2), NOW();语句中,取出的时间值是同一个:’2006-04-12 13:47:36’。
然后:now()函数取的当前时间从哪里来?它取自mysql的一个变量”TIMESTAMP”。
很奇怪吧?
其实这个是由于MySQL的replication导致的。你可以想象一下,一个insert into gguard values (3,now());语句在两台MySQL上插入的值是不是一样?now()如果像sysdate()一样取的是机器的系统时间,那么在MySQL的主库和备库执行同一个这样的SQL语句,主库和备库的这一条数据肯定就不一致了。
主备库不一致的问题必须要解决,两种解决方式:
1、修复这种问题。
2、不使用statement的语句级别复制,而是类似于oracle的,将数据变更记录下来,原样在备库执行一遍。
第二种方式就是大家熟知的,binlog_format=ROW的方式。第一种就是now()不使用机器系统时间,而是取mysql的变量”TIMESTAMP”值。
另外的类似的变量还包括insert_id(用于复制时,AUTO_INCREMENT的取值)等
利用mysqlbinlog你可以看到每个binlog event都有一个时间值。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # at 441 #121205 10:06:52 server id 5 end_log_pos 526 Query thread_id=5 exec_time=0 error_code=0 SET TIMESTAMP=1354673212.982122/*!*/; BEGIN /*!*/; # at 526 #121205 10:06:52 server id 5 end_log_pos 642 Query thread_id=5 exec_time=0 error_code=0 use `test`/*!*/; SET TIMESTAMP=1354673212.982122/*!*/; insert into gguard values (3,now()) /*!*/; # at 642 #121205 10:06:52 server id 5 end_log_pos 669 Xid = 26 COMMIT/*!*/; | 
备库复制执行时,SQL thread在做每个insert或者其他操作前首先要执行SET TIMESTAMP这样的动作,保证now()函数在statement模式下在备库和主库一样。
这里还有另外一种含义:sysdate()函数在statement模式下,主库和备库会不一致,也就是说sysdate在statement复制模式下是不安全的。
那么怎么实现上面的SELECT NOW(),SYSDATE();查询出来的时间不一样列,你只需要在之前执行:
| 1 2 | SET TIMESTAMP=UNIX_TIMESTAMP('1999-01-01'); SELECT NOW(),SYSDATE(); | 
体验now()和sysdate()的神秘吧
注意:
CURRENT_TIMESTAMP() LOCALTIME() LOCALTIMESTAMP()都是now()函数的同义词,不讨论。
sysdate()没有同义词。
如果你觉得now()函数就够了,你不需要每次都取当前的机器系统时间,那么你可以在MySQL启动时指定–sysdate-is-now,这样的话MySQL会把sysdate()当成now()的一个同义词。
MYSQL的NOW和SYSDATE函数的区别的更多相关文章
- MySQL存储过程/存储过程与自定义函数的区别
		语法: 创建存储过程: CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parame ... 
- (转)MySQL存储过程/存储过程与自定义函数的区别
		转自:http://www.cnblogs.com/caoruiy/p/4486249.html 语法: 创建存储过程: CREATE [definer = {user|current_user}] ... 
- 【存储过程】MySQL存储过程/存储过程与自定义函数的区别
		---------------------------存储过程-------------------- 语法: 创建存储过程: CREATE [definer = {user|current_user ... 
- MySQL中SYSDATE()和NOW()函数的区别和联系
		MySQL中有5个函数需要计算当前时间的值: NOW.返回时间,格式如:2012-09-23 06:48:28 CURDATE,返回时间的日期,格式如:2012-09-23 CURTIME,返回时间, ... 
- mysql中,now()函数和sysdate()函数有什么区别?
		问题描述: 今天在看mysql的时间函数,now()和sysdate(),记录下两者之间有什么不同. 实验过程: 1.执行以下的两个语句: mysql),now(); +--------------- ... 
- mysql  NOW,CURRENT_TIMESTAMP,SYSDATE 之间的区别
		这些函数都可以返回当前的系统时间,但它们之间有什么区别呢??大家先看一下以下这个例子. select NOW(), CURRENT_TIMESTAMP(),SYSDATE(); 从上面的例子可以看出返 ... 
- MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别
		1 MySQL存储过程和函数 过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快. 1.1 存储过程 存储 ... 
- 字符串函数    mysql 和sqlserver 中对于字符串的常用函数和区别
		1. 对于字符串大小写的统一 mysql和sqlserver中都有同名函数lower()和upper(),但是mysql中还有另外一对函数,达到同样的目的,lcase()和ucase(),也就是英文中 ... 
- sqlserver 和MySQL的一些函数的区别
		相同的表数据在sqlserver和MySQL中使用各自的函数得到相同的结果,如下表 drop table tb;create table tb(id int, value1 varchar(10), ... 
随机推荐
- [javascript]两段 javaScript 代码的逻辑比较
			两段 javaScript 代码的逻辑比较: #1 if(tagName.length < 3){ $(this).parent().addClass('active'); tagN ... 
- Objective-C 学习笔记(五) 指针
			Objective-C 指针 每一个变量是一个内存位置和每一个存储单元都有其定义的地址,可以使用符号(&)的运算符,它表示内存中的地址访问. a. 我们定义一个指针变量 b. 分配一个指针变量 ... 
- django 的 ajax 方式上传图片
			页面代码: <html> <!-- 引入相关的js文件,相对路径 --> <script type="text/javascript" ... 
- mvc和mvvm的区别?
			源自:https://segmentfault.com/q/1010000000534091?_ea=178721 Model:很简单,就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与 ... 
- sharepoint site performance
			分析了您之前提供的在CPU使用率高的时候抓取的w3wp进程的dump,以下是一些发现: 在抓取dump文件的这个时刻,.Net的垃圾回收正在运行,在内存资源紧张时,.Net会自动启动内存垃圾回收机制, ... 
- sharepoint 2007 log track
			1. 以管理员权限运行CMD 2. 运行命令: NOTEPAD c:\windows\system32\drivers\etc\hosts 3. 在打开的记事本中最后一行添加一条记录后保存. ... 
- 【UI组件】——用jQuery做一个上拉刷新
			技术要点: 1.jQuery的插件写法 2.上拉刷新步骤分解 3.css样式 jQuery的插件写法: $.fn.pluginName = function() { return this.each( ... 
- HTML基础总纲
			我看了很多博客感觉如果自己写的话还不一定有人家写的好,在介于我没有时间从这么细小的知识总结,那么人家总结好的我们为什么不用,完了之后在就自己的感受和不足之处在做补充. 我们一个的讲:主要参考: 一,H ... 
- 异步 JavaScript - 事件循环
			简评:如果你对 JavaScript 异步的原理感兴趣,这里有一篇不错的介绍. JavaScript 同步代码是如果工作的 在介绍 JavaScript 异步执行之前先来了解一下, JavaScrip ... 
- 说说MySQL权限
			前言 今天继续MySQL系列文章,讲讲MySQL权限相关的内容.我们都知道,在写系统的时候,都会有权限相关的服务,以达到权限控制的目的.以最简单的权限菜单为例: 管理员拥有最大权限,可以查看系统下所有 ... 
