【问题标题】:Spring JDBC MySQL/MariaDB Data truncated for column 'start_date' at row 1Spring JDBC MySQL/MariaDB 数据在第 1 行截断列“start_date”
【发布时间】:2016-12-13 11:29:08
【问题描述】:

我正在使用 Spring JDBC 将分类广告对象存储到我的 MariaDB 数据库中,如下所示:

public void insert(ClassifiedAd classifiedAd){

   this.jdbcTemplate.update(new PreparedStatementCreator(){

      @Override
      public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {

          PreparedStatement ps = connection.prepareStatement(INSERT_SQL, Statement.RETURN_GENERATED_KEYS);
          ...
          ps.setTimestamp(6, new Timestamp(classifiedAd.getStartDate().getTimeInMillis()));
          ...
          return ps;
        }
   }, keyHolder);

分类广告对象有一个字段private Calendar startDate,我将其转换为java.sql.Timestamp,然后将其映射到数据库中的相应列start_date datetime null,

但是在插入时我收到以下警告:

Dec 13, 2016 10:59:10 AM com.mchange.v2.c3p0.SQLWarnings logAndClearWarnings
INFO: Data truncated for column 'start_date' at row 1
java.sql.SQLWarning: Data truncated for column 'start_date' at row 1
    at org.mariadb.jdbc.MariaDbConnection.getWarnings(MariaDbConnection.java:833)
    at com.mchange.v2.c3p0.impl.NewProxyConnection.getWarnings(NewProxyConnection.java:907)
    at com.mchange.v2.c3p0.SQLWarnings.logAndClearWarnings(SQLWarnings.java:42)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishResourceOnCheckin(C3P0PooledConnectionPool.java:285)
    at com.mchange.v2.resourcepool.BasicResourcePool.attemptRefurbishResourceOnCheckin(BasicResourcePool.java:1606)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$200(BasicResourcePool.java:32)
    at com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1228)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)

我真的不明白为什么时间戳被截断,因为它被指定为here,它是正确使用的类型。有什么帮助吗?

编辑

这些是我在插入前后得到的值:

初始值:

System.out.println(BankCardDAOTest.expiration_date.get(Calendar.DAY_OF_MONTH) + "/"
    + (classifiedAd.getStartDate.get(Calendar.MONTH) + 1) + "/"
    + classifiedAd.getStartDate.get(Calendar.YEAR) + " "
    + classifiedAd.getStartDate.get(Calendar.HOUR) + ":"
    + classifiedAd.getStartDate.get(Calendar.MINUTE) + ":"
    + classifiedAd.getStartDate.get(Calendar.SECOND));

====> 27/7/2016 4:3:54

插入和检索对象后:

dao.insert(classifiedAd);
classifiedAd = dao.select(classifiedAd.getId());

====> 27/7/2016 0:0:0

有什么帮助吗?

【问题讨论】:

  • 我唯一能想到的是日期格式问题...您的日期是如何存储在 mariadb 表中的...您可以发布该字段的 select 语句的结果吗?跨度>
  • 在 MariaDB 服务器上启用常规日志,运行您的代码,您将立即看到它发送的内容以及产生警告的原因。

标签: java mysql database mariadb jdbctemplate


【解决方案1】:

DATEs 应格式化为 2016-12-31
DATETIMETIMESTAMP 值应格式化为 2016-12-31 23:59:59

其他格式可能会导致您收到错误消息。

【讨论】:

  • 我该怎么做?
  • 日期字符串从何而来?它们长什么样子?
【解决方案2】:

抱歉,我的数据库库是使用 date 列而不是 datetime 生成的,我更正了它现在工作正常...

【讨论】:

    猜你喜欢
    • 2012-06-23
    • 2016-12-11
    • 2013-10-03
    • 2021-08-19
    • 2021-08-28
    • 1970-01-01
    • 2014-01-09
    • 2021-03-14
    相关资源
    最近更新 更多