web-dev-qa-db-ja.com

MYSQLの不正なDATETIME形式

Doctrine 1のアプリがあり、new Zend_Date->getIso()を介してオブジェクトのupdate_datetimeフィールドを生成します。何年も問題なく動作しましたが、新しいノートブックを入手しましたおよびDoctrineは、完全に奇妙な通常のMySQL日時フォーマット"2013-07-12T03:00:00+07:00"ではなく、DATETIMEフィールドを文字列"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を削除します

UPDATE2STRICTを永久に取り除く方法は? MySQLでSTRICT SQLモードを削除する方法

22
firedev

存在する場合は、my.iniのsql-modeからSTRICT_TRANS_TABLESを削除してみてください。

これにより、mysql datetimeに変換されていない形式を含むdatetime文字列値でこのエラーが発生する可能性があります。このmy.iniの変更は、次の修正として報告されました。

12
hakre

Zendの日付定数は、この順序でロケールをスニッフィングして決定されます(zend_localeコメントを形成)

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

2つのシステムの違いがサーバー環境に反映されると思います。

将来この問題を修正して回避するために、これらの構成ディレクティブを使用してapplication.ini内でロケールオプションを指定できます。

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

ロケールはen_USのような文字列に設定する必要があります

Zend_Localeは、具体的には setlocale を呼び出して結果を解析することにより、環境からロケールを探知します。

2
Orangepill

これは、Zendがタイムスタンプ形式をMySQLが期待するものと一致する形式に設定していないことが原因です。 MySQLでSTRICTモードを無効にすることもできますが、これはハッキングであり、解決策ではありません(MySQLは、入力している日付が何であるかを推測しようとします)。

Zendでは、日時形式をMySQLがこれを解決することを期待しているものに設定できます。

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

StackOverflowコミュニティの助けを借りて、ようやく解決しました。問題は、sql_mode変数のSTRICT_TRANS_TABLESにありました。しかし、/ etc/my.cnfでそれを変更するだけでは不十分に思われたため、mysql -urootを実行して次のように入力する必要がありました。

sql_mode = NO_ENGINE_SUBSTITUTIONを設定します。グローバルsql_mode = NO_ENGINE_SUBSTITUTIONを設定します。

したがって、STRICT_TRANS_TABLESを削除します

------この答えは機能します

0
wangxuan