首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ER_TRUNCATED_WRONG_VALUE:不正确的日期时间值

ER_TRUNCATED_WRONG_VALUE:不正确的日期时间值
EN

Stack Overflow用户
提问于 2017-06-01 10:15:14
回答 2查看 27.2K关注 0票数 19

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

我正在使用MySQL和Node.js(我知道,我们不喜欢它,但必须有人尝试)。我有一个套接字,它将聊天消息添加到mysql消息表中,其中包含文本、日期时间等。日期时间设置为new Date()

现在,当我将应用程序放置在生产服务器(重新安装依赖项、mysql等)时,我在编写消息时突然收到了这个错误:

代码语言:javascript
运行
复制
Error: ER_TRUNCATED_WRONG_VALUE: Incorrect datetime value: '2017-06-01T09:45:06.253Z' for column 'message_datetime' at row 1

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

发展:

代码语言:javascript
运行
复制
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'突然不是一种有效的日期格式?我该怎么解决这个问题?

感谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-01 10:52:54

显然,datetime值不是有效的MySQL日期时间。但是有一项关于修改服务器SQL模式的工作。

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

代码语言:javascript
运行
复制
mysql> select @@sql_mode;
    +------------+
    | @@sql_mode |
    +------------+
    |            |
    +------------+
    1 row in set (0.00 sec)

另一方面,在生产服务器上,有大量的限制告诉mysql服务器应该接受什么样的日期时间格式。

代码语言:javascript
运行
复制
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限制模式更改为no_engine_substitution,瞧,一切都像魅力一样工作(几乎)。您必须更改全局和会话模式才能使其工作。

标准的SQL模式是‘’,所以我们将把这个模式放到这个模式上。有更多的模式,你可以添加硬:

代码语言:javascript
运行
复制
SET GLOBAL sql_mode = '<mode>';
SET SESSION sql_mode = '<mode>';

现在应该将全局和会话模式设置为NO_ENGINE_SUBSTITUTION。

代码语言:javascript
运行
复制
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)
票数 21
EN

Stack Overflow用户

发布于 2019-09-11 09:19:16

同样的答案(由@Jesper给出)是错误的。

代码语言:javascript
运行
复制
ERROR 1292 (22007): Truncated incorrect DOUBLE value: ''

即我的

代码语言:javascript
运行
复制
select @@GLOBAL.sql_mode; -- and
select @@SESSION.sql_mode;

给出

STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

当我把它们更新到

代码语言:javascript
运行
复制
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';

我的SQL插入执行时没有出现故障。

此错误是由于严格的SQL模式造成的。因此,仅从STRICT_TRANS_TABLES中删除sql_mode就足够了。例如

代码语言:javascript
运行
复制
SET SESSION sql_mode = 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44304777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档