【问题标题】:MYSQL incorrect DATETIME formatMYSQL DATETIME 格式不正确
【发布时间】:2013-07-10 00:50:16
【问题描述】:

我有一个带有 Doctrine 1 的应用程序,我通过 new Zend_Date->getIso() 为对象生成 update_datetime 字段。多年来它工作得很好,但现在我有了一个新笔记本,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_TABLES 中的sql_mode 变量。但是在/etc/my.cnf 中更改它似乎还不够,所以我不得不运行mysql -uroot 并输入以下内容:

set sql_mode=NO_ENGINE_SUBSTITUTION; set global sql_mode=NO_ENGINE_SUBSTITUTION;

因此删除STRICT_TRANS_TABLES

更新2 如何永远摆脱 STRICT? How to get rid of STRICT SQL mode in MySQL

【问题讨论】:

  • 我会在两台机器上查看您的php.ini 配置。有些东西告诉我你已经在一个而不是另一个上设置了默认时区。
  • 已添加 date.timezone - 相同。还有其他想法吗?
  • 当您比较 PHP 和 Mysql Server 版本以及 Mysql 客户端库版本(和类型)时,您发现了哪些差异?分析此问题的一种方法是找出配置的差异,因为如果存在相同的配置,应用程序将运行相同。 几乎相同可以不同。例如,一台服务器是否在后台使用 mysqlnd?
  • 特别注意一下 Mysql Server 版本并比较那个 mysql 配置。这看起来像是 mysql 服务器接受哪些值作为日期时间的问题。这可能是 mysql 服务器配置问题。
  • 问题本身的更新对我有用

标签: php mysql zend-framework doctrine doctrine-1.2


【解决方案1】:

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

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 专门从环境中嗅探语言环境并解析结果。

【讨论】:

  • 我有Zend_Locale::setDefault('en_US') 这还不够吗?
  • 如果我的假设是正确的,那么它应该是......我会继续挖掘,出于好奇,你使用的是什么操作系统,如果有的话,如果你运行LC_TIME,你会得到什么@987654327 @来自命令行(应该在 linux 和 mac 中可用)
  • 问题出在 Mac OS 10.8.9 上,这里是语言环境输出:LC_TIME="en_GB.UTF-8" 在其他可以正常工作的计算机上也是如此。就我所见,一切都一样。
  • 在 ZF 1.x 的每个版本中,我返回 Zend_Date::getIso 的格式为 2013-07-12T03:00:00+07:00。我无法调整环境中的任何内容以使其输出不同的输出字符串。您能否尝试运行echo (new Zend_Date)-&gt;getIso();,看看您是否在工作主机和非工作主机之间获得不同格式的日期。
  • 您是否在 tableDefinition 中将相关字段明确定义为模型中的日期时间?
【解决方案2】:

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

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

【讨论】:

  • 天哪,就是这样!谢谢!但是怎么做? STRICT_TRANS_TABLES 如果无法将给定的值插入到事务表中,请中止该语句。对于非事务性表,如果值出现在单行语句或多行语句的第一行中,则中止语句。本节稍后将提供更多详细信息。 (在 MySQL 5.0.2 中实现)
  • 原来这只是修复了一半,Zend 或 Doctrine 中是否有一些选项可以在运行时设置它?我现在在应用程序的另一部分偶然发现了同样的问题。
【解决方案3】:

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

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

$log = new Zend_Log ();
$log->setTimestampFormat("Y-m-d H:i:s");

【讨论】:

  • 这为日志设置了它......不是无处不在
  • @Orangepill 当然可以,这是如何设置时间戳格式的示例。不幸的是,我对 Zend 不够熟悉,不知道如何在全局范围内设置它。
  • 它在 Zend_Locale... 我已经把那棵树叫了起来。并且 getIso 创建了与语言环境设置无关的相同样式的时间戳。 Hakre 那里可能有一些东西。如果除了环境之外所有东西都相同,那么问题一定是配置不同。
  • harke 的回答肯定会“修复”它,但这不是真正的解决方案,只是掩盖问题。
【解决方案4】:

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

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

因此删除 STRICT_TRANS_TABLES

-----这个答案有效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2017-05-29
    • 2010-10-06
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2018-04-03
    相关资源
    最近更新 更多