在尝试将记录插入某个表格时,我收到如下错误:
数据截断:日期时间值不正确:' 0000-00-00 00:00:00'对于列' deleted_at'在第1行
搜索我发现以下问题非常有见地:
但由于以下原因,我无法采取这些答案中给出的任何解决方案:
deleted_at
。显然,有一个针对此的检查。你看,最初,delete_at日期不能设置(我会使用像is_deleted
这样的标志。如果有更好的方法请告诉我。)至于您遇到此问题的原因,您的会话的sql_mode设置可能包含
NO_ZERO_DATES
。
我(遗憾地)对这些事情没有多少控制权,因为我不是唯一一个参与这个项目的人。为了让您了解项目,我就是这样做的错误。
他们不使用任何记录。希望你能得到这张照片。
所以,考虑到我受约束的限制,有没有办法插入00:00:00'除了上面给出的解决方案(我希望可能在JDBC中使用某些东西)。
MySQL服务器版本: 5.7.12-0ubuntu1
答案 0 :(得分:6)
经过三天的辛劳,我终于找到了解决方案。
正如本answer所述,如果变量sql_mode
设置为NO_ZERO_DATES
,MySQL将不允许插入零日期。
至于您遇到此问题的原因,您的会话的sql_mode设置可能包含
NO_ZERO_DATES
。
现在,我可以通过在命令行中执行以下操作来清除变量sql_mode
:
SET GLOBAL sql_mode = '';
但如前所述,我不允许这样做。所以,我需要一个基于会话的解决方案。这是document本身给出的。
SET SESSION sql_mode = '';
因此,我在打开连接后添加了以下行。
try (Statement statementSet = connection.createStatement()) {
statementSet.execute("SET SESSION sql_mode = ''");
}
它有效。我能够使用'0000-00-00 00:00:00'插入和更新datetime字段。这仅清除了当前会话的sql_mode
变量。全局设置就是这样。
mysql> SHOW VARIABLES LIKE 'sql_mode';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| 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 |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
我必须这样做,因为我别无选择。不建议这样做。