MYSQL日期时间格式错误

22
我有一个使用Doctrine 1的应用程序,我通过new Zend_Date->getIso()为对象生成update_datetime字段。多年来一直运行良好,但现在我换了新笔记本电脑,Doctrine尝试将DATETIME字段作为字符串"2013-07-12T03:00:00 + 07:00"插入,而不是正常的MySQL datetime格式"2013-07-12 00:00:00",这完全奇怪。
相同的代码在另一台计算机上运行良好。所有内容几乎都相同 - 在两者上都是MySQL 5.6.12,PHP 5.3.15。有什么想法应该看哪里?
致命错误:Doctrine_Connection_Mysql_Exception异常抛出消息“SQLSTATE [22007]:无效的日期时间格式:第1行的'nextrun'列的1292个不正确的日期时间值:'2013-07-12T03:00:00 + 07:00'”在library / Doctrine / Connection.php:1083
更新
好的,在StackOverflow社区的帮助下,我终于解决了它。问题出在sql_mode变量中的STRICT_TRANS_TABLES。但是在/etc/my.cnf中更改它似乎还不够,所以我必须运行mysql -uroot并键入以下内容: set sql_mode = NO_ENGINE_SUBSTITUTION; set global sql_mode = NO_ENGINE_SUBSTITUTION; 从而删除STRICT_TRANS_TABLES 更新2 如何永久摆脱STRICT? 如何在MySQL中摆脱严格的SQL模式

我会查看您在任一台机器上的 php.ini 配置。有些东西告诉我,您在其中一台机器上设置了默认时区,而在另一台机器上没有设置。 - Phil
添加了 date.timezone - 相同。还有其他想法吗? - firedev
当您比较PHP和Mysql服务器版本以及Mysql客户端库版本(和类型)时,您会看到哪些差异?分析此问题的一种方法是找到配置的差异,因为如果有相同的配置,则应用程序将运行相同。即使是“几乎”相同也可能不同。例如,一个服务器是否在幕后使用mysqlnd? - hakre
特别注意Mysql服务器版本,并比较该mysql配置。这似乎是一个关于mysql服务器接受日期时间值的问题。这可能是一个mysql服务器配置问题。 - hakre
问题本身的更新对我起了作用。 - Dimitris Baltas
4个回答

12

哦,我的天啊,就是这样!谢谢你!但是怎么做到的?STRICT_TRANS_TABLES如果一个值不能按照给定的方式插入到事务表中,则终止该语句。对于非事务表,在单行语句或多行语句的第一行中出现该值时,终止该语句。本节稍后将详细介绍。(MySQL 5.0.2 中实现) - firedev
1
结果发现这只是半个修复,Zend或Doctrine内部是否有一些选项可以在运行时设置?我现在在应用程序的另一个部分遇到了相同的问题。 - firedev

2
在Zend中,日期常量是通过以下方式从语言环境中推断出来的(根据Zend_Locale注释):
1. Given Locale
2. HTTP Client
3. Server Environment
4. Framework Standard

我认为这两个系统的区别将会反映在服务器环境中。要纠正并避免这个问题,在应用程序.ini 中使用以下配置指令可以指定语言环境选项。请注意保留HTML标签。
resources.locale.default = <DEFAULT_LOCALE>
resources.locale.force = false
resources.locale.registry_key = "Zend_Locale"

应将locale设置为类似于en_US的字符串。

Zend_Locale从对setlocale的调用中获取环境的locale,并解析结果。


我有 Zend_Locale::setDefault('en_US') 这个应该足够了吧? - firedev
1
如果我的假设是正确的,那么应该是......我会继续挖掘。顺便问一下,您使用的是什么操作系统?如果可用的话,从命令行运行locale,看一下LC_TIME的值是多少(在Linux和可能的Mac中应该都可以找到)。 - Orangepill
1
问题出在 Mac OS 10.8.9 上,这是本地输出:LC_TIME="en_GB.UTF-8" 在其他正常工作的计算机上也是一样的。据我所见,所有东西都是相同的。 - firedev
在你的模型中,你是否已经明确地将该字段定义为datetime类型,并在tableDefinition中进行了定义? - Orangepill
在工作环境上运行getIso的输出是什么? - Orangepill
显示剩余3条评论

2
这是由于Zend没有将您的时间戳格式设置为与MySQL期望的格式相匹配所致。您可以在MySQL中禁用STRICT模式,但这只是一个hack而不是解决方案(MySQL将尝试猜测您输入的日期是什么)。在Zend中,您可以设置日期时间格式以解决此问题:
$log = new Zend_Log ();
$log->setTimestampFormat("Y-m-d H:i:s");

这将为日志设置它...但不是所有地方。 - Orangepill
当然可以,@Orangepill。这是一个设置时间戳格式的示例。不幸的是,我对Zend不够熟悉,不知道如何全局设置它。 - Developer
它在Zend_Locale中...我已经试过了。而且getIso创建的时间戳风格独立于语言环境设置。Hakre可能有一些线索。如果所有的东西都相同,除了环境,那么问题必须是配置上的差异。 - Orangepill
Harke的回答肯定会“修复”它,但这不是一个真正的解决方案,只是掩盖问题的方法。 - Developer

0

在 StackOverflow 社区的帮助下,我终于解决了问题。问题在于 sql_mode 变量中的 STRICT_TRANS_TABLES。但是在 /etc/my.cnf 中更改似乎不够,因此我不得不运行 mysql -uroot 并键入以下内容:

set sql_mode=NO_ENGINE_SUBSTITUTION; set global sql_mode=NO_ENGINE_SUBSTITUTION;

从而删除 STRICT_TRANS_TABLES。

------这个答案有效


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