2017-06-01 298 views
1

所以我最近完成了一个研究项目的申请。这一切都很好,我所剩下的就是将应用程序投入生产。ER_TRUNCATED_WRONG_VALUE:错误的日期时间值

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

感谢您的帮助!

+0

https://dev.mysql.com/doc/refman/5.7/en/ datetime.html:_“MySQL以'YYYY-MM-DD HH:MM:SS'格式检索并显示DATETIME值。支持的范围是'1000-01-01 00:00:00'至'9999-12-31 23:59:59' 。“_ – CBroe

+1

_”我没有得到开发中的错误“_ - 这可能更像是一个服务器配置(关于容错)的问题,而不是它实际上的工作,并将_valid_日期插入到数据库中 – CBroe

+0

@CBroe我didn我甚至不知道有不同的容错能力,我在我的开发环境中使用了vagrant,但是把生产服务器放在数字海洋上,或许生产服务器上的某种更新降低了容错性,然后 – Jesper

回答

3

显然,日期时间值不是有效的MySQL Datetime。但是有一项修改Server SQL Modes的工作。

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

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

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

标准的SQL模式是'NO_ENGINE_SUBSTITUTION',所以我们把模式放在那。还有更多的模式,你可以添加强硬:

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

现在全球和会话模式应设置为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) 
+0

你应该接受你的答案以表明你已经找到了一个解决方案 – RobG

+0

@RobG好吧,我得等待1天&4小时做到这一点 – Jesper

+0

@Jesper看起来你在这里有个小错字,第二个命令应该是'''mysql> SET GLOBAL sql_mode ='NO_ENGINE_SUBSTITUTION';''' –