Неверный формат DATETIME от MYSQL
У меня есть приложение с Doctrine 1, и я генерирую поля update_datetime
для объектов через new Zend_Date->getIso()
. В течение многих лет он работал отлично, но теперь у меня появился новый блокнот, и Doctrine пытается вставить поля DATETIME
в виде строки "2013-07-12T03:00:00+07:00"
вместо обычного формата datetime 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
UPDATE
Хорошо с помощью сообщества 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
UPDATE2
Как избавиться от STRICT навсегда? Как избавиться от режима STRICT SQL в MySQL
Ответы
Ответ 1
Если он существует, вы можете попробовать удалить STRICT_TRANS_TABLES
из sql-mode в my.ini.
Это может привести к этой ошибке со строковым значением datetime, содержащим формат, который вы не преобразовали в mysql datetime. Это изменение my.ini было сообщено как исправление в:
Ответ 2
Константы даты в zend определяются исходя из локализации в этом порядке (форма zend_locale comments)
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 и анализирует результаты.
Ответ 3
Это вызвано тем, что Zend не устанавливает формат timestamp в соответствие с тем, что ожидает MySQL. Вы можете отключить режим STRICT в MySQL, но это взлом, а не решение (MySQL будет пытаться угадать, какая дата вы входите).
В Zend вы можете установить формат даты и времени для того, что ожидает от этого MySQL:
$log = new Zend_Log ();
$log->setTimestampFormat("Y-m-d H:i:s");
Ответ 4
Хорошо с помощью сообщества StackOverflow, я, наконец, решил его. Проблема была в STRICT_TRANS_TABLES в переменной sql_mode. Но изменить его в /etc/my.cnf оказалось недостаточно, поэтому мне пришлось запустить mysql -uroot и набрать следующее:
установить sql_mode = NO_ENGINE_SUBSTITUTION; установить глобальный sql_mode = NO_ENGINE_SUBSTITUTION;
Таким образом, удаление STRICT_TRANS_TABLES
------ этот ответ работает