Jes*_*per 11 javascript mysql datetime date node.js
所以我最近完成了一个研究项目的申请.这一切都很好,我剩下的就是将应用程序投入生产.
我正在使用带有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
Run Code Online (Sandbox Code Playgroud)
我没有在开发中遇到这个错误,所以我问自己是否下载了不同版本的mysql ...我做了:
发展:
mysql Ver 14.14 Distrib 5.5.54, for debian-linux-gnu (i686) using readline 6.3
Run Code Online (Sandbox Code Playgroud)
生产
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'
突然不是有效的日期格式?我该如何解决?
感谢任何帮助!
Jes*_*per 13
显然,datetime值不是有效的MySQL Datetime.但是有一项工作可以修改服务器SQL模式.
出于某种原因,在我的开发服务器中,完全删除了MySQL默认模式配置.因此,我没有限制如何插入日期时间.
mysql> select @@sql_mode;
+------------+
| @@sql_mode |
+------------+
| |
+------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
另一方面,在生产服务器上,有大量限制告诉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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
这不是一种安全的方法,但我将MySQL限制模式更改为no_engine_substitution
,并且瞧,一切都像魅力一样(差不多).您必须更改GLOBAL和SESSION模式才能使其正常工作.
标准的SQL模式是'NO_ENGINE_SUBSTITUTION',所以我们将模式设置为.您可以添加更多模式:
SET GLOBAL sql_mode = '<mode>';
SET SESSION sql_mode = '<mode>';
Run Code Online (Sandbox Code Playgroud)
现在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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8616 次 |
最近记录: |