需要针对MySQL的JDBC解决方案错误的日期时间值错误

时间:2016-04-30 19:07:54

标签: java mysql datetime jdbc

在尝试将记录插入某个表格时,我收到如下错误:

  

数据截断:日期时间值不正确:' 0000-00-00 00:00:00'对于列' deleted_at'在第1行

搜索我发现以下问题非常有见地:

但由于以下原因,我无法采取这些答案中给出的任何解决方案:

  • 使用提到的任何其他JAR herehere(虽然这不是一个maven项目)不是一个选项。我必须使用相同的罐子。
  • 我不能使用除00:00:00&00:00之前的任何其他内容。对于字段deleted_at。显然,有一个针对此的检查。你看,最初,delete_at日期不能设置(我会使用像is_deleted这样的标志。如果有更好的方法请告诉我。)
  • 更改MySQL配置并不是像here那样的选项。他做了很好的解释。我认为这是主要问题。
  

至于您遇到此问题的原因,您的会话的sql_mode设置可能包含NO_ZERO_DATES

我(遗憾地)对这些事情没有多少控制权,因为我不是唯一一个参与这个项目的人。为了让您了解项目,我就是这样做的错误。

enter image description here

他们不使用任何记录。希望你能得到这张照片。

所以,考虑到我受约束的限制,有没有办法插入00:00:00'除了上面给出的解决方案(我希望可能在JDBC中使用某些东西)。

MySQL服务器版本: 5.7.12-0ubuntu1

1 个答案:

答案 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)

我必须这样做,因为我别无选择。不建议这样做。