Javascript ER\u截断\u错误\u值:不正确的日期时间值
所以我最近完成了一个研究项目的申请。一切都很好,我只剩下将应用程序投入生产 我在Node.js中使用MySQL(我知道,我们不喜欢这样,但总得有人尝试一下)。我有一个套接字,可以向mysql消息表中添加聊天消息,其中包含文本、日期时间等。日期时间设置为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:
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';
)```