ER_TRUNCATED_WRONG_VALUE:错误的date时间值

所以我最近完成了一个研究项目的申请。 这一切都很好,而我所剩下的就是将应用程序投入生产。

我使用的Node.js与MySQL(我知道,我们不喜欢,但有人得尝试它)。 我有一个socket聊天消息添加到消息表,其中包含文本,date时间等date时间设置为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'突然不是有效的date格式? 我该如何解决?

感谢任何帮助!

显然,date时间值不是有效的MySQLdate时间 。 但是有一个修改服务器SQL模式的工作 。

出于某种原因,在我的开发服务器中,MySQL默认模式configuration被完全删除。 因此,如何插入date时间没有限制。

 mysql> select @@sql_mode; +------------+ | @@sql_mode | +------------+ | | +------------+ 1 row in set (0.00 sec) 

另一方面,在生产服务器上,有很多限制,告诉mysql服务器什么样的date时间格式可以接受。

 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 | +-------------------------------------------------------------------------------------------------------------------------------------------+ 

我110%肯定这不是一个安全的方法,但我改变了MySQL的限制模式no_engine_substitution ,瞧,一切都作为魅力(几乎)。 您必须更改GLOBAL和SESSION模式才能正常工作。

标准的SQL模式是'NO_ENGINE_SUBSTITUTION',所以我们把模式放在那。 还有更多的模式可以增加难度:

 SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes'; 

现在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 SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'; mysql> SELECT @@GLOBAL.sql_mode; +------------------------+ | @@GLOBAL.sql_mode | +------------------------+ | NO_ENGINE_SUBSTITUTION | +------------------------+ 1 row in set (0.00 sec)