在MySQL查询中使用NOW()函数可能会导致延迟吗?

5

我正在图书馆通过一本书学习MySQL和PHP。我正在改进密码加密系统的安全性,将密码存储方式从

password=SHA('password')

to

password=SHA(CONCAT('password', '--', registration_date))

这里的registration_date是用户注册时的时间戳。

目前用户注册的代码如下:

INSERT INTO users (first_name, last_name, email, password, registration_date) 
VALUES ('first_name', 'last_name', 'email', SHA(CONCAT('password', '--', NOW())), NOW());

我需要担心两个不同的NOW()函数吗?它们有可能有稍微不同的时间吗?我用了几个查询尝试了一下,似乎都可以正常工作。

如果出现问题,我该如何解决?


你最好非常、非常、非常、非常、非常、非常确定 registration_date 字段永远不会被更新。否则,你会发现用户数量突然减少了。 - Larry Lustig
@Larry - 这同样适用于密码字段。 :) - Ted Hopp
2个回答

3
没有问题。根据手册:
NOW()返回一个常量时间,表示语句开始执行的时间。(在存储函数或触发器中,NOW()返回函数或触发语句开始执行的时间。)
正如手册所示的例子,每个语句中对NOW()的求值都返回相同的值,而与这些求值之间经过了多少时间无关。

0

在一个服务器上,您不必担心。根据文档:

NOW()返回一个常量时间,表示语句开始执行的时间。

(http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_now) 因此,在一个查询中该值不会更改。

但是,您应该注意基于语句的复制。 如果数据库以这种方式进行复制(例如用于备份或高可用性),则从库可能具有与主库不同的 NOW()


关于SBR的好处。主从可能确实有不同的NOW()值。但是在从库的一行中,NOW()的值将是相同的_在该行中_。(我认为这就是OP担心可能会失败的原因。)如果主从之间的NOW()值的差异是一个问题,那么基于行的复制可以解决这个问题。或者,也可以尝试使用SET TIMESTAMP(它会影响NOW()的值)来解决这个问题。 - Ted Hopp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接