【问题标题】:Need JDBC solution for MySQL Incorrect datetime value errorMySQL Incorrect datetime value error 需要 JDBC 解决方案
【发布时间】:2016-08-25 20:04:46
【问题描述】:

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

数据截断:不正确的日期时间值:第 1 行的列“deleted_at”的“0000-00-00 00:00:00”

四处搜索我发现以下问题很有见地:

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

  • 使用提到的任何其他 JAR here 和 here(尽管这不是一个 maven 项目)不是一个选项。我必须使用同一个罐子。
  • 除了“0000-00-00 00:00:00”字段deleted_at 之外,我不能使用任何其他内容。显然,有大量的检查工作。你看,最初不能设置 delete_at 日期(我会使用像 is_deleted 这样的标志。如果有更好的方法请告诉我)。
  • 并且更改 MySQL 配置不是像 here 提到的选项。他很好地解释了这一点。我认为这是主要问题。

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

我(很遗憾)对这些事情没有太多控制权,因为我不是唯一一个从事这个项目的人。为了让您深入了解该项目,这就是我得到错误的方式。

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

因此,考虑到我所受的约束,除了上面给出的解决方案之外,还有其他方法可以插入“0000-00-00 00:00:00”(我希望可能在 JDBC 中使用某些东西)。

MySQL 服务器版本:5.7.12-0ubuntu1

【问题讨论】:

  • 用 null 代替 '0000-00-00 00:00:00' 怎么样?这可能吗?
  • @chris579 已经考虑过了,但是这些人已经做了一个字符串比较来检查记录是否被删除。如果他们愿意更改代码或配置,就不会出现问题。
  • 嗯,你说的是“这些家伙”,他们是关于什么的?知道我们在说什么会很有帮助。老实说,我很确定没有办法。看来您正在扩展其他人的代码。如果是这样,找到合适的解决方法将非常困难
  • 我同意 chris579,似乎服务器配置不允许该值。如果您无法更改配置并且必须插入该值,那么您将陷入僵局。 “这些家伙”如何插入新记录?
  • @UrsinusTheStrong 哇,支持你的领导。好像真的很感慨。我希望你为这项工作赚钱,否则我会很快离开。顺便说一句,仍然想知道使用 gui 和 java 的公司/项目。因此切换到.net

标签: java mysql datetime jdbc


【解决方案1】:

经过三天的努力,我终于想出了一个解决方案。

正如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”插入和更新日期时间字段。这仅清除了当前会话的 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)

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

【讨论】:

  • 很高兴你终于解决了。恭喜。你可以接受自己的答案,你知道的,不是吗?
  • @RubioRic 谢谢。是的,我可以在 2 天后接受答案。感谢您抽出时间进行讨论。 :)
  • 像魅力一样工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-03-21
  • 2017-08-06
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 2019-02-27
  • 1970-01-01
相关资源
最近更新 更多