最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

ER

IT培训 admin 4浏览 0评论

ER

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

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

感谢您的帮助!

回答如下:

显然,日期时间值不是有效的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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+

这不是一个安全的方法,但是我将MySQL限制模式更改为no_engine_substitution,瞧,一切都像一个超级按钮一样工作。您必须更改GLOBAL和SESSION模式才能使它起作用。

标准SQL模式为'NO_ENGINE_SUBSTITUTION',因此我们将其设置为该模式。您还可以添加更多模式:

SET GLOBAL sql_mode = '<mode>';
SET SESSION sql_mode = '<mode>';

现在应将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)

ER

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

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

感谢您的帮助!

回答如下:

显然,日期时间值不是有效的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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+

这不是一个安全的方法,但是我将MySQL限制模式更改为no_engine_substitution,瞧,一切都像一个超级按钮一样工作。您必须更改GLOBAL和SESSION模式才能使它起作用。

标准SQL模式为'NO_ENGINE_SUBSTITUTION',因此我们将其设置为该模式。您还可以添加更多模式:

SET GLOBAL sql_mode = '<mode>';
SET SESSION sql_mode = '<mode>';

现在应将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)

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论