ER_TRUNCATED_WRONG_VALUE:日期时间值不正确

Jes*_*per 11 javascript mysql datetime date node.js

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

我正在使用带有Node.js的MySQL(我知道,我们不喜欢它,但是有人必须尝试它).我有一个套接字,它将一条聊天消息添加到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
Run Code Online (Sandbox Code Playgroud)

我没有在开发中遇到这个错误,所以我问自己是否下载了不同版本的mysql ...我做了:

发展:

mysql  Ver 14.14 Distrib 5.5.54, for debian-linux-gnu (i686) using readline 6.3
Run Code Online (Sandbox Code Playgroud)

生产

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'突然不是有效的日期格式?我该如何解决?

感谢任何帮助!

Jes*_*per 13

显然,datetime值不是有效的MySQL Datetime.但是有一项工作可以修改服务器SQL模式.

出于某种原因,在我的开发服务器中,完全删除了MySQL默认模式配置.因此,我没有限制如何插入日期时间.

mysql> select @@sql_mode;
    +------------+
    | @@sql_mode |
    +------------+
    |            |
    +------------+
    1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

另一方面,在生产服务器上,有大量限制告诉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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

这不是一种安全的方法,但我将MySQL限制模式更改为no_engine_substitution,并且瞧,一切都像魅力一样(差不多).您必须更改GLOBAL和SESSION模式才能使其正常工作.

标准的SQL模式是'NO_ENGINE_SUBSTITUTION',所以我们将模式设置为.您可以添加更多模式:

SET GLOBAL sql_mode = '<mode>';
SET SESSION sql_mode = '<mode>';
Run Code Online (Sandbox Code Playgroud)

现在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)
Run Code Online (Sandbox Code Playgroud)

  • @Jesper看起来您在这里有小错字。第二个命令应该是“ mysql&gt; SET GLOBAL sql_mode ='NO_ENGINE_SUBSTITUTION';`” (2认同)