Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ER\u截断\u错误\u值:不正确的日期时间值_Javascript_Mysql_Node.js_Date_Datetime - Fatal编程技术网

Javascript ER\u截断\u错误\u值:不正确的日期时间值

Javascript ER\u截断\u错误\u值:不正确的日期时间值,javascript,mysql,node.js,date,datetime,Javascript,Mysql,Node.js,Date,Datetime,所以我最近完成了一个研究项目的申请。一切都很好,我只剩下将应用程序投入生产 我在Node.js中使用MySQL(我知道,我们不喜欢这样,但总得有人尝试一下)。我有一个套接字,可以向mysql消息表中添加聊天消息,其中包含文本、日期时间等。日期时间设置为new date() 现在,当我将应用程序放在生产服务器中(重新安装依赖项、mysql等)时,我在编写消息时突然出现了以下错误: Error: ER_TRUNCATED_WRONG_VALUE: Incorrect datetime value:

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

我在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
我在开发中没有遇到这个错误,所以我问自己是否下载了不同版本的mysql。。。我做到了:

发展:

mysql  Ver 14.14 Distrib 5.5.54, for debian-linux-gnu (i686) using readline 6.3
生产

mysql版本14.14发行版5.7.18,适用于Linux(x86_64),使用EditLine包装器

消息表如下所示:

创建表消息(
消息id INT自动增量,
消息\u发送方\u id VARCHAR(80)不为空,
消息\u datetime datetime,
信息文本,
消息\u chat\u id INT不为空,
主键(消息_id),
外键(消息\u聊天\u id)引用聊天(id)
关于删除级联
)引擎=InnoDB

那么有什么区别呢?为什么
'yyyy-mm-ddThh:mm:ss.%%%Z'
突然不是有效的日期格式?我该如何解决这个问题


谢谢你的帮助

显然,日期时间值是无效的。但有一项工作是围绕修改

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

mysql> select @@sql_mode;
    +------------+
    | @@sql_mode |
    +------------+
    |            |
    +------------+
    1 row in set (0.00 sec)
另一方面,在生产服务器上,有大量的限制告诉mysql服务器接受哪种datetime格式

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限制模式更改为
无引擎替换
,瞧,一切都像一个符咒(几乎)。您必须更改全局和会话模式才能使其工作

标准的SQL模式是“无引擎替换”,因此我们将把该模式设置为“无引擎替换”。您可以添加更多模式:

SET GLOBAL sql_mode = '<mode>';
SET SESSION sql_mode = '<mode>';
相同的答案(由@Jesper给出)适用于错误

ERROR 1292 (22007): Truncated incorrect DOUBLE value: ''
i、 e.我的

select @@GLOBAL.sql_mode; -- and
select @@SESSION.sql_mode;
给予

严格的转换表,错误除以零,没有自动创建用户,没有引擎替换

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)
当我把它们更新到

SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
我的SQL插入执行时没有出现问题

此错误是由于严格的SQL模式造成的。因此,仅从sql_模式中删除严格的_TRANS_表就足够了。比如说

SET SESSION sql_mode = 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

:“MySQL检索并显示'YYYY-MM-DD HH:MM:SS'格式的日期时间值。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。“我在开发中没有遇到这个错误”-这可能是服务器配置的问题(关于容错性)它实际起作用,并将有效日期插入数据库。@CBroe我甚至不知道有不同的错误容忍度。我在开发环境中使用了vagrant,但在digital ocean上安装了生产服务器。也许生产服务器中的某种更新降低了容错能力,然后感谢您发布此问题。我曾想象自己发布了一个类似的问题,关于JavaScript/Angular中的“Z”被MySQL拒绝,我也听天由命地说了一些类似的话(我知道,我们不喜欢它,但有人必须尝试一下)。很高兴看到它也在那里你应该接受你的答案,以表明你已经找到了解决办法。@RobG好吧,我得等一天四个小时才能做that@Jesper看起来你这里有一个小的打字错误。第二个命令应该是
mysql>SET GLOBAL sql_mode='NO_ENGINE_SUBSTITUTION'
我和你有同样的问题,但我还必须在
sql\u模式下添加
允许无效日期
,才能让我的应用程序正常工作。但是:尽管MySQL清楚地检测到给定的日期无效,但正确地存储它们并没有问题…@Scorpio590如何在MySQL上允许无效日期?感谢这一点,在使用knex将sqlite导出到MySQL的json过程中帮了我的忙,我添加了这个knex.raw()``js knex.raw()(
SET SESSION sql_mode='NO_ENGINE_SUBSTITUTION';SET GLOBAL sql_mode='NO_ENGINE_SUBSTITUTION';
)```