【问题标题】:Data truncation: Incorrect datetime value数据截断:日期时间值不正确
【发布时间】:2018-10-25 11:31:35
【问题描述】:

我在一个使用 mysql db 的 spring 项目中工作。当应用程序在我的本地运行时,每个插入和更新 sql 命令都在项目的后端运行时,我得到了“日期时间”变量的这些类型异常;

原因:java.sql.BatchUpdateException:数据截断:不正确的日期时间值:第 1 行的列“CREATION_DATE”的“” 在 com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:665) 在 org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 在 org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) ... 54 更多

Mysql 版本:5.7.18,mysql-connector-java 版本:-5.1.38,用户时区在 tomcat 7 vm 参数和 db 时区为“-Duser.timezone=Europe/Istanbul”:GMT +3

示例代码块;

        ResponseCreateTicket response = new ResponseCreateTicket();
        TicketDTO ticket=new TicketDTO();
ticket.setTicketNumber(UUID.randomUUID().toString().toUpperCase(Locale.ENGLISH));
        ticket.setStatus(TicketStatus.UNCOMPLETED.toString());
        Date date = new Date();
        ticket.setCreatedOn(date);
        ticket.setReferenceNumber(request.getReferenceNumber());
        getTicketDAO().createTicket(ticket);
        response.setTicketNumber(ticket.getTicketNumber());
        return response;

sql休眠显示和绑定参数;

休眠:插入 eis_ticket (TICKET_NUMBER, STATUS, CREATED_BY, CREATION_DATE, LAST_UPDATED_BY, LAST_UPDATE_DATE, REFERENCE_NUMBER, ID) 值(?, ?, ?, ?, ?, ?, ?, ?) 2018-05-16 10:57:37 TRACE BasicBinder:? - 绑定参数 [1] 作为 [VARCHAR] - 9BF25A08-C442-45FA-A95F-8E59502CE037 2018-05-16 10:57:37 TRACE BasicBinder:? - 绑定参数 [2] 作为 [VARCHAR] - 未完成 2018-05-16 10:57:37 TRACE BasicBinder:? - 将参数 [3] 绑定为 [VARCHAR] - 2018-05-16 10:57:37 TRACE BasicBinder:? - 绑定参数 [4] 作为 [TIMESTAMP] - 2018 年 5 月 16 日星期三 10:57:32 EEST 2018-05-16 10:57:37 TRACE BasicBinder:? - 将参数 [5] 绑定为 [VARCHAR] - 2018-05-16 10:57:37 TRACE BasicBinder:? - 绑定参数 [6] 作为 [TIMESTAMP] - 2018-05-16 10:57:37 TRACE BasicBinder:? - 绑定参数 [7] 作为 [VARCHAR] - b4be9b87-21c4-4001-b80d-244420ab2e00 2018-05-16 10:57:37 TRACE BasicBinder:? - 绑定参数 [8] 作为 [BIGINT] - 1925 2018-05-16 10:57:37 错误 JDBCExceptionReporter:? - 数据截断:不正确的日期时间值:第 1 行的列“CREATION_DATE”的“”

日期格式可以更改为“yyyy-MM-dd HH:mm:ss”,但项目中有数百个此类代码,因此不是正确的解决方案。什么可能导致这个问题? Mysql 连接器已更新但无法正常工作。

【问题讨论】:

  • 你必须展示一些代码。堆栈跟踪中的日期时间值似乎为空。
  • 该错误表示传递给日期时间列的空字符串。您需要传递一个null 值,而不是一个空字符串,但您真的不应该 将字符串传递给日期时间列。使用PreparedStatementTimestamp
  • 问题已被编辑。

标签: java mysql hibernate jdbc


【解决方案1】:

如果列类型是日期时间,您可以轻松修改列并将默认设置为CURRENT_TIMESTAMP,这样可以确保插入的每条记录都默认为当前服务器的日期和时间。但是,如果您手动生成时间戳,则应用程序上生成的数据类型与插入数据库时​​使用的数据类型不同 您可以使用它来修改列默认值,然后在插入记录时保留creation_type列NULL

ALTER TABLE table MODIFY CREATION_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL;

【讨论】:

  • 这个问题不仅仅发生在创建日期,它发生在每个日期时间类型。如果列类型更改为CURRENT_TIMESTAMP,记录不同的时间我们会怎么做?
猜你喜欢
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多