在MySQL查询中使用NOW()时可能出现延迟?

在MySQL查询中使用NOW()时可能出现延迟?,mysql,Mysql,我正在图书馆通过一本书学习MySQL和PHP。我正在通过将密码存储从更改为提高密码加密系统的安全性 password=SHA('password') 到 其中,registration\u date是用户注册时的时间戳 注册用户的当前代码为: INSERT INTO users (first_name, last_name, email, password, registration_date) VALUES ('first_name', 'last_name', 'email', SHA(

我正在图书馆通过一本书学习MySQL和PHP。我正在通过将密码存储从更改为提高密码加密系统的安全性

password=SHA('password')

其中,
registration\u date
是用户注册时的时间戳

注册用户的当前代码为:

INSERT INTO users (first_name, last_name, email, password, registration_date) 
VALUES ('first_name', 'last_name', 'email', SHA(CONCAT('password', '--', NOW())), NOW());
我需要担心其中的两个不同的NOW()函数吗?他们是否有可能有稍微不同的时间?我试着问了几个问题,结果似乎没问题


如果有问题,我将如何解决它?

没有问题。从:

NOW()返回一个常量时间,指示语句开始执行的时间。(在存储的函数或触发器中,NOW()返回函数或触发器语句开始执行的时间。)


正如手册通过示例所示,语句中对
NOW()
的每次求值都返回相同的值,而不管求值之间经过了多少时间。

在一台服务器上,您不必担心。从文件中:

NOW()返回一个常量时间,该时间指示 语句开始执行

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


不过,您应该注意基于语句的复制。如果您的数据库有可能以这种方式复制(例如备份或HA),那么从属数据库可能与主数据库有不同的
NOW()

您最好非常、非常、非常、非常、非常确定registration\u date字段永远、永远、永远、永远、永远不会更新。否则,您会发现自己突然缺少用户。@Larry-这也适用于密码字段。:)关于SBR的观点很好。主设备和从设备可能确实具有不同的
NOW()
值。但是从机的一行中的
NOW()
的值将与该行中的值相同。(我认为OP担心的是这可能会失败。)如果主从
NOW()
值之间的差异是一个问题,那么基于行的复制可以解决这个问题。或者,可以使用
SET TIMESTAMP
(这会影响
NOW()
的值)玩游戏来解决问题。
INSERT INTO users (first_name, last_name, email, password, registration_date) 
VALUES ('first_name', 'last_name', 'email', SHA(CONCAT('password', '--', NOW())), NOW());