对于microtime中(真)DECIMAL长度是多少?(DECIMAL length for mi

2019-08-06 00:08发布

我想PHP的microtime中存储为我在MySQL时间戳。

我已经告诉它最好将其存储在DECIMAL ,但我不能找到一个理想的大小。

有谁知道的最大尺寸microtime(true)的回报,所以我可以把那作为我的数据类型的长度是多少?

我应该选择可变DECIMAL长?

Answer 1:

TL;博士。 使用microtime中(假),并在MySQL BIGINT结果存储为百万分之一秒。 否则,你必须学会​​所有关于浮点运算,这是一个大胖子的毛球。

在PHP函数microtime中抓住了Unix时间戳(目前约为十六进制50eb7c00或十进制1357609984)从一个系统调用,并从另一个系统调用微秒的时间。 然后,这使他们成为一个字符串。 然后,如果你(真)调用它,它转换,这个数字为64位IEEE 745浮点数的事情PHP调用float

从今天起,你需要十位十进制数字的小数点左边的存储整数UNIX时间戳。 这将忠于直到大约2280 CE时,你的后裔将开始需要十一位。 你需要六位数字到小数点的位置存储微秒的权利。

你不会得到总微秒精度。 大多数系统保持自己的亚秒级的系统时钟与在1-33毫秒范围内的东西分辨率。 这取决于系统。

MySQL版本5.6.4和更高版本允许你指定DATETIME(6)列,这将举办日期和时间,以微秒分辨率。 如果你使用这样的MySQL版本是绝对要走的路。

5.6.4版本之前,你需要使用MySQL DOUBLE (IEEE 754 64位浮点数)来存储这些数据。 MySQL的FLOAT (IEEE 754的32位浮点)不具有足够的位在其尾数甚至本UNIX时间存储在秒完全准确。

你为什么要保存这些时间戳? 你希望做

  WHERE table.timestamp = 1357609984.100000

或类似的查询来查找特定的项目? 那如果你在处理链中使用float或双号的任何地方(也就是,即使你用的是充满了危险microtime(true)甚至一度)。 他们是臭名昭著的,即使你认为他们不应该上来相等。 相反,你需要使用这样的事情。 在0.001被称为“小量”的数字加工贸易。

  WHERE table.timestamp BETWEEN 1357609984.100000 - 0.001
                            AND 1357609984.100000 + 0.001

或类似的东西。 如果你存储这些时间戳为小数或在一秒钟百万分之一你不会有这样的问题bigint列。

IEEE 64位浮点尾数具有53位 - 的精度。 本Unix时间戳的时间戳(因为1-JAN-197000秒:00Z)倍百万使用51个比特。 所以没有太多额外的精度在DOUBLE如果我们关心的低位。 在另一方面,精度不会为几个世纪的冒了出来。

你是隔靴搔痒运行的精度的Int64(BIGINT)。 如果我实际上是存储微秒只是为他们的MySQL中的排序时间戳,我会跟去DATETIME(6)因为我得到许多日期计算的是免费的。 如果我做一个内存大容量的应用程序,我会使用Int64的。



Answer 2:

这取决于你所需要的精度。 如果毫秒都够你,你不要指望任何运行时间比999999秒大,你可以使用DECIMAL(10,4) 你可以把它适合你的需要这种方式。

关于理论最大值,它是由大小的限制float系统(32位,64位)。 见PHP浮法了解详情。 但正如我所说,这是理论上的。 不定时会给你在精确的时间。



Answer 3:

在MySQL 5.6.4以上, 天然DATETIMETIMESTAMP类型可以支持小数秒 。 因此,可以存储与在一微秒分辨率时间戳DATETIME(6)或一个TIMESTAMP(6)的列。

到PHP转换microtime()的返回值到MySQL日期时间格式,你可以使用MySQL FROM_UNIXTIME()函数,或者,如果你使用的PHP DateTime类, DateTime::format() 需要注意的是,PHP date()函数目前支持微秒时间戳。 (它确实有微秒,格式代码u ,但它总是将其映射至000000 。)

对于旧版本的MySQL,它不能存储微秒他们的母语时间类型,则应使用DOUBLEBIGINT (用微秒表示的值,即乘了1,000,000)或DECIMAL(16,6)这应该几足够百年还)。



Answer 4:

你为什么不只是它保存为float ? 这就是microtime(true)的回报,所以这是最好的人选。



文章来源: DECIMAL length for microtime(true)?