首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >microtime的十进制长度(True)?

microtime的十进制长度(True)?
EN

Stack Overflow用户
提问于 2013-01-08 07:54:29
回答 4查看 10.7K关注 0票数 11

我想将PHP的微时间作为我的时间戳存储在MySQL中。

我一直在told最好将它存储在DECIMAL中,但我找不到理想的大小。

谁知道microtime(true)的最大返回值是多少,所以我可以把它作为我的数据类型长度?

我应该选择可变DECIMAL长度吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-08 09:31:33

tl;使用microtime(false)并将结果以百万分之一秒的形式存储在MySQL大整数中。否则,你必须学习所有关于浮点运算的知识,这是一个很大的问题。

PHP microtime函数从一个系统调用获取Unix时间戳(当前约为十六进制50eb7c00或十进制1,357,609,984),从另一个系统调用获取微秒时间。然后,它将它们转换为字符串。然后,如果使用(true)调用它,它会将该数字转换为64位IEEE745浮点数,这是PHP称为float的东西。

到今天为止,您需要小数点左边的十个十进制数字来存储整型UNIX时间戳。直到公元2280年左右,当你的后代开始需要11位数字时,这一点才会改变。您需要小数位右边的六位数来存储微秒。

你不会得到完全的微秒精度。大多数系统将其亚秒级系统时钟保持在1-33毫秒范围内的分辨率。它依赖于系统。

MySQL版本5.6.4及更高版本允许您指定DATETIME(6)列,这些列将保存精确到微秒级的日期和时间。如果你正在使用这样的MySQL版本,那绝对是最好的选择。

在5.6.4版本之前,您需要使用MySQL DOUBLE (IEEE754 64位浮点)来存储这些数字。MySQL FLOAT (IEEE75432位浮点)的尾数位数不足以完全准确地存储当前的UNIX时间。

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

代码语言:javascript
复制
  WHERE table.timestamp = 1357609984.100000

或者类似的查询来查找特定的项目?如果您在处理链中的任何位置使用浮点数或双精度数(即,即使您使用microtime(true)一次也是如此),这将充满危险。他们臭名昭著,即使在你认为他们应该平等的时候,他们也不会平等。取而代之的是,你需要使用这样的东西。在数字加工贸易中,0.001?被称为"epsilon“。

代码语言:javascript
复制
  WHERE table.timestamp BETWEEN 1357609984.100000 - 0.001
                            AND 1357609984.100000 + 0.001

或者类似的东西。如果将这些时间戳存储为小数或以百万分之一秒为单位存储在bigint列中,则不会出现此问题。

IEEE64位浮点数有53位的尾数-精度。目前的UNIX Epoch时间戳(自1970年1月1日00:00Z以来的秒数)乘以一百万,使用51位。因此,如果我们关心低阶位,那么在双精度中没有太多额外的精度。另一方面,精度在几个世纪内都不会用完。

Int64的精确度还远远没有用完。如果我实际上只是为了在MySQL中对时间戳进行排序而存储微秒时间戳,我会使用DATETIME(6),因为我会免费获得大量的日期算法。如果我在做一个内存中的大容量应用程序,我会使用int64。

票数 16
EN

Stack Overflow用户

发布于 2013-01-08 08:02:16

这取决于您需要的精确度。如果毫秒对你来说足够了,并且你不期望任何超过999999秒的运行时,你可以使用DECIMAL(10,4)。您可以通过这种方式使其适合您的需求。

关于理论上的最大值,它受到系统上float (32位、64位)大小的限制。详情请参见PHP Float。但正如我所说的,这只是理论上的。没有计时器会给你精确的时间。

票数 1
EN

Stack Overflow用户

发布于 2013-01-08 09:50:32

在MySQL 5.6.4及更高版本中,the native DATETIME and TIMESTAMP types can support fractional seconds。因此,您可以在DATETIME(6)TIMESTAMP(6)列中存储微秒精度的时间戳。

要将PHP返回值转换为MySQL日期时间格式,可以使用MySQL FROM_UNIXTIME()函数,如果使用的是PHP datetime类,则可以使用DateTime::format()。请注意,PHP date()函数目前不支持微秒时间戳。(它确实有一个表示微秒的格式代码u,但它总是将其映射到000000。)

对于较旧的MySQL版本,不能在其原生datetime类型中存储微秒,您应该使用DOUBLEBIGINT (值以微秒表示,即乘以1,000,000)或DECIMAL(16,6) (这应该足够几百年了)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14206159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档