所以我最近完成了一个学习项目的申请。这一切都很好,我所剩下的就是把应用程序投入生产。
我正在使用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'突然不是一种有效的日期格式?我该怎么解决这个问题?
感谢你的帮助!
发布于 2017-06-01 10:52:54
显然,datetime值不是有效的MySQL日期时间。但是有一项关于修改服务器SQL模式的工作。
由于某些原因,在我的开发服务器中,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,瞧,一切都像魅力一样工作(几乎)。您必须更改全局和会话模式才能使其工作。
标准的SQL模式是‘’,所以我们将把这个模式放到这个模式上。有更多的模式,你可以添加硬:
SET GLOBAL sql_mode = '<mode>';
SET SESSION sql_mode = '<mode>';现在应该将全局和会话模式设置为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)https://stackoverflow.com/questions/44304777
复制相似问题