now()与sysdate()两个函数都以'YYYY-MM-DD HH:MM:SS'的形式表示表示当前的时间。比如:
root@rac1 21:13:10> select sysdate();
+---------------------+
| sysdate() |
+---------------------+
| 2013-01-12 21:14:21 |
+---------------------+
1 row in set (0.00 sec)
root@rac1 21:14:21> select now();
+---------------------+
| now() |
+---------------------+
| 2013-01-12 21:14:29 |
+---------------------+
1 row in set (0.00 sec)
两者的区别在于对于一个语句中调用多个函数
NOW() 返回语句调用时的值,在存过或者trigger 中now()返回的值是存过或者trigger 执行的时刻的时间。
SYSDATE() 返回调用该函数的时刻的时间值。
举例说明两者之间的区别:
root@rac1 21:07:16> select now(),sleep(3),now(); -返回的时间是一致的。
+---------------------+----------+---------------------+
| now() | sleep(3) | now() |
+---------------------+----------+---------------------+
| 2013-01-12 21:07:30 | 0 | 2013-01-12 21:07:30 |
+---------------------+----------+---------------------+
1 row in set (3.00 sec)
root@rac1 21:10:23> select sysdate(),sleep(2),sysdate();
+---------------------+----------+---------------------+
| sysdate() | sleep(2) | sysdate() |
+---------------------+----------+---------------------+
| 2013-01-12 21:11:06 | 0 | 2013-01-12 21:11:08 |
+---------------------+----------+---------------------+
上述查询返回sysdate()函数被调用的时刻的时间值。
还有另外一个时间相关的函数current_timestamp() 与now()一致。
root@rac1 21:07:33> select now(),current_timestamp(),sysdate();
+---------------------+---------------------+---------------------+
| now() | current_timestamp() | sysdate() |
+---------------------+---------------------+---------------------+
| 2013-01-12 21:09:59 | 2013-01-12 21:09:59 | 2013-01-12 21:09:59 |
+---------------------+---------------------+---------------------+
1 row in set (0.00 sec)
root@rac1 21:10:08> select now(),sleep(2),current_timestamp();
+---------------------+----------+---------------------+
| now() | sleep(2) | current_timestamp() |
+---------------------+----------+---------------------+
| 2013-01-12 21:10:21 | 0 | 2013-01-12 21:10:21 |
+---------------------+----------+---------------------+
1 row in set (2.00 sec)
当sysdate函数在基于satement 模式的主从环境下可能造成数据的不一致。因为语句在主库中执行到日志传递到备库,存在时间差,到备库执行的时候就会变成不同的时间值。
解决方法:
1 通过设置sysdate-is-now参数,使mysql对于sysdate调用采用和now一样的行为,配置该参数的时候要在主备同事配置。
2 采取row模式的复制环境。
参考资料: