在Symfony2(Doctrine)和MySQL中启用微秒级别

6

我有一个实体,其中有一个列是“datetime”类型,用于存储时间戳。

/**
 * @ORM\Column(type="datetime")
 */
protected $timestamp;

我之前使用的是MySQL 5.5.40,但我发现它不支持存储微秒级别的时间。因此,我升级到了5.6.21版本并导入了所有的表和数据。

在使用新版本时,我尝试声明类型为:

 * @ORM\Column(type="datetime(6)")

但是它给了我一个错误。所以我直接在数据库中进行了更改:

ALTER TABLE symfony.hrmgmt MODIFY timestamp DATETIME(6);
在我的控制器中,我这样做:
  $dt = new \DateTime('now');
  $newHREvent->setTimestamp($dt);

然而,时间戳存储时并不包含秒的分数。

我可以通过 SQL 手动输入带有小数值的日期时间,但是当我通过控制器执行时,它总是以 .000000 存储。

我想这是因为 Doctrine 不知道它也可以存储微秒。

我的 PHP 版本仍为 5.4.34。

谢谢!


https://dev59.com/CnE85IYBdhLWcg3w3Xlp - Charlotte Dunois
2
我已经阅读了那篇文章。大多数答案都是针对MySQL 5.6之前的版本,因此不相关。@Xavier Portebois的回答很相关,我准确地遵循了使用DATETIME(6)而不是DATETIME的指示。问题(根据我的问题)仍然存在,如果我尝试使用Doctrine而不是纯SQL。阅读Doctrine文档,我发现“已知供应商问题”(http://doctrine-dbal.readthedocs.org/en/latest/reference/known-vendor-issues.html),其中提到了PostgreSQL中的微秒问题,但没有提到MySQL。 - Sergio Negri
在“已知供应商问题”中(尽管在PostgreSQL部分),有这样的评论:“这就是为什么Doctrine总是想创建没有微秒的时间相关类型...如果您不让Doctrine创建日期列类型,而是使用带有微秒的类型,则必须使用更自由的DateTime解析器来替换“DateTime”、“DateTimeTz”和“Time”类型,该解析器可以自动检测格式”。那么这是否证实了Doctrine仍不支持微秒?我应该如何编写所提到的“自由解析器”? - Sergio Negri
请注意,微秒问题仅在“PostgreSQL”和“Microsoft SQL Server”下提到,而不是在MySQL(或其他数据库)下提到。 - Sergio Negri
我也在这里阅读了http://doctrine-dbal.readthedocs.org/en/latest/reference/types.html,其中提到“datetime”被映射为DATETIME,但脚注中说:“如果列定义不包含平台选项属性数组中的版本选项或设置为false,该选项将被选择作为非锁定信息列。” 我该怎么做? - Sergio Negri
2个回答

2

简短摘要 #

关注这篇博客,创建您自己的自定义数据类型并使用它 https://blog.tomhanderson.com/2018/09/datetime-with-microseconds-for-mysql-in.html

对于耐心和好奇心强的人

我在经历了您提到的确切步骤之后来到这里,升级mysql,手动更改列数据类型精度,我处于与您完全相同的状态...

这与PHP版本无关,而是Doctrine在此处发挥了作用。

就像对于十进制值,doctrine支持精度和比例type="decimal" 例如:precision=10, scale=2,它应该支持datetime,但目前还没有支持

问题当前正在此处跟踪 https://github.com/doctrine/dbal/issues/2873

然而,有一篇博客解释了一个解决方法,直到doctrine在他们的端口修复这个问题 https://blog.tomhanderson.com/2018/09/datetime-with-microseconds-for-mysql-in.html

我相信它是由Tom H Anderson撰写的


1
易于使用且运行良好。 - Roubi

1
要创建带微秒的日期时间,您需要在控制器中使用DateTime :: createFromFormat
$date = \DateTime::createFromFormat('U.u', (string)microtime(true));

1
问题不在于 PHP 层面对象的创建,而是在 Doctrine 层面。 - Sergio Negri
是的,但你使用了 new \DateTime('now');,所以它不能正常工作,因为它不存储微秒时间。 - goto
在 PHP 7 中并非如此。 - Arthur
什么不是真的?在php 7上似乎工作正常(例如这里:http://sandbox.onlinephpfunctions.com/code/0c4f1e2e02f739eee8ad10e163375322480b9f1e)。 - goto
2
抱歉,我的回答是针对您的评论的。我的意思是 new \DateTime('now'); 自 PHP 7 起存储微秒。编辑:我错了,应该是 PHP 7.1。 - Arthur

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