ということで、最近、研究プロジェクト用のアプリケーションを完成させました。すべて順調で、あとはアプリケーションを本番環境に導入するだけです。
私は MySQL を Node.js で使用しています (私たちはそれを好んでいませんが、誰かが試す必要があります)。テキスト、日付時刻などを含むチャット メッセージを mysql メッセージ テーブルに追加するソケットがあります。日付時刻は に設定されていますnew Date()
。
アプリケーションを本番サーバーに配置した(依存関係、mysql などを再インストールした)ところ、メッセージを書き込むときに突然次のエラーが発生します。
Error: ER_TRUNCATED_WRONG_VALUE: Incorrect datetime value: '2017-06-01T09:45:06.253Z' for column 'message_datetime' at row 1
開発中にそのエラーは発生しなかったので、異なるバージョンの MySQL をダウンロードしたかどうかを自問しました...そして、そうしました:
発達:
mysql Ver 14.14 Distrib 5.5.54, for debian-linux-gnu (i686) using readline 6.3
生産
mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using EditLine wrapper
メッセージ テーブルは次のようになります。
CREATE TABLE message ( message_id INT AUTO_INCREMENT, message_sender_id VARCHAR(80) NOT NULL, message_datetime DATETIME, message_text TEXT, message_chat_id INT NOT NULL, PRIMARY KEY(message_id), FOREIGN KEY(message_chat_id) REFERENCES chat(id) ON DELETE CASCADE ) ENGINE=InnoDB;
では、違いは何でしょうか?'yyyy-mm-ddThh:mm:ss.%%%Z'
突然、日付形式が有効でなくなったのはなぜでしょうか? これを修正するにはどうすればよいでしょうか?
ご協力いただければ幸いです!
ベストアンサー1
どうやら、datetime値は有効ではないようですMySQL 日付時刻しかし、サーバーSQLモード。
何らかの理由で、私の開発サーバーでは、MySQL のデフォルト モード構成が完全に削除されていました。そのため、datetime を挿入する方法に制限はありませんでした。
mysql> select @@sql_mode;
+------------+
| @@sql_mode |
+------------+
| |
+------------+
1 row in set (0.00 sec)
一方、実稼働サーバーでは、mysql サーバーにどのような日時形式を受け入れるかを指示する制限が大量にありました。
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
これは安全な方法ではありませんが、MySQL の制限モードを に変更するとno_engine_substitution
、すべてがうまく機能します (ほぼ)。これを機能させるには、GLOBAL モードと SESSION モードを変更する必要があります。
標準の SQL モードは 'NO_ENGINE_SUBSTITUTION' なので、このモードに設定します。ただし、追加できるモードは他にもあります。
SET GLOBAL sql_mode = '<mode>';
SET SESSION sql_mode = '<mode>';
GLOBALとSESSIONモードをNO_ENGINE_SUBSTITUTIONに設定する必要があります。
mysql> SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';
mysql> SELECT @@SESSION.sql_mode;
+------------------------+
| @@SESSION.sql_mode |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)
mysql> SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
mysql> SELECT @@GLOBAL.sql_mode;
+------------------------+
| @@GLOBAL.sql_mode |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)