22

我有一个带有 Doctrine 1 的应用程序,我update_datetime通过new Zend_Date->getIso(). 多年来它工作得很好,但现在我有了一个新笔记本,Doctrine 尝试将DATETIME字段作为字符串插入,"2013-07-12T03:00:00+07:00"而不是普通的 MySQL 日期时间格式"2013-07-12 00:00:00",这很奇怪。

相同的代码在另一台计算机上运行得很好。一切都几乎相同——MySQL 5.6.12,PHP 5.3.15 都在。知道我应该在哪里看吗?

Fatal error: Uncaught exception 'Doctrine_Connection_Mysql_Exception' with message 'SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2013-07-12T03:00:00+07:00' for column 'nextrun' at row 1' in library/Doctrine/Connection.php:1083

更新

好的,在 StackOverflow 社区的帮助下,我终于解决了。问题出STRICT_TRANS_TABLESsql_mode变量中。但是更改它/etc/my.cnf似乎还不够,所以我不得不运行mysql -uroot并输入以下内容:

set sql_mode=NO_ENGINE_SUBSTITUTION; set global sql_mode=NO_ENGINE_SUBSTITUTION;

从而去除STRICT_TRANS_TABLES

UPDATE2 如何永远摆脱严格?如何摆脱 MySQL 中的 STRICT SQL 模式

4

4 回答 4

12

如果存在,您可以尝试STRICT_TRANS_TABLES从 my.ini 中的 sql-mode 中删除。

这可能会导致此错误,日期时间字符串值包含您尚未转换为 mysql 日期时间的格式。此 my.ini 更改已报告为以下方面的修复:

于 2013-08-02T07:00:58.737 回答
2

zend 中的日期常量是通过按此顺序嗅出语言环境来确定的(形成 zend_locale 注释)

1. Given Locale
2. HTTP Client
3. Server Environment
4. Framework Standard

我认为这两个系统之间的差异将反映在服务器环境中。

要在以后更正和避免此问题,您可以使用这些配置指令在 application.ini 中指定区域设置选项。

resources.locale.default = <DEFAULT_LOCALE>
resources.locale.force = false
resources.locale.registry_key = "Zend_Locale"

语言环境应设置为类似的字符串en_US

Zend_Locale 专门通过调用setlocale从环境中嗅探语言环境并解析结果。

于 2013-07-19T00:04:54.837 回答
1

这是由于 Zend 没有将时间戳格式设置为与 MySQL 所期望的格式相匹配的格式。您可以在 MySQL 中禁用 STRICT 模式,但这是一个 hack 而不是解决方案(MySQL 将尝试猜测您输入的日期是什么)。

在 Zend 中,您可以将日期时间格式设置为 MySQL 期望解决的问题:

$log = new Zend_Log ();
$log->setTimestampFormat("Y-m-d H:i:s");
于 2013-08-02T21:44:06.120 回答
0

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

设置 sql_mode=NO_ENGINE_SUBSTITUTION; 设置全局 sql_mode=NO_ENGINE_SUBSTITUTION;

因此删除 STRICT_TRANS_TABLES

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

于 2017-06-09T09:09:31.117 回答