mariadb:jdbc:setTimestamp截断毫秒

时间:2014-08-22 11:20:56

标签: java jdbc mariadb

在我看来,如果我使用preparedStatement将它们插入到我的mariadb中,毫秒会被截断。谷歌搜索它不成功,我发现许多类似的问题要么已经解决,要么不适用。但是很难相信我是唯一一个遇到这个问题的人所以我想在向mariadb提交bug之前先问这里。 代码非常简单:

表:

create table tt (id decimal(10), create_time timestamp(6) default 0);
or
create table tt (id decimal(10), create_time datetime(6) default 0);

Javacode:

Class.forName("org.mariadb.jdbc.Driver");
Connection conn = DriverManager.getConnection(DB_URL,"root","abc");
Statement insert1 = conn.createStatement();
insert1.execute("insert into tt (id, create_time) values (1,'2013-07-18 13:44:22.123456')");
PreparedStatement insert2 = conn.prepareStatement(
  "insert into tt (id, create_time) values (?,?)");
insert2.setInt(1, 2);
insert2.setTimestamp(2, new Timestamp(1273017612999L));
insert2.execute();

我的DOS控制台输出:

MariaDB [duc]> select * from tt;
+------+----------------------------+
| id   | create_time                |
+------+----------------------------+
|    1 | 2013-07-18 13:44:22.123456 |
|    2 | 2010-05-05 02:00:12.000000 |
+------+----------------------------+
2 rows in set (0.00 sec)

==> id = 2会丢失毫秒。

这看起来像是一个错误吗?或者我做错了什么?

操作系统:windows7,64位 MariaDB版本:10.0.12 JDBC连接器:1.1.7(mariadb)或5.1.32(mysql)

我在Oracle数据库上测试了相同的代码:插入毫秒。

感谢您的帮助......

更新:我向mariaDB错误数据库报告了这个问题:https://mariadb.atlassian.net/browse/CONJ-107

2 个答案:

答案 0 :(得分:8)

您需要在MariaDB JDBC驱动程序中启用“useFractionalSeconds”。例如,“jdbc:mariadb://127.0.0.1:3306 / somedb?useFractionalSeconds = true”。

(恕我直言,这应该默认启用,我不知道为什么不是。)

答案 1 :(得分:0)

不仅仅是你。我能够在Windows 8和Ubuntu 14.04下使用MariaDB 10.0.13重新创建您的问题。在Windows框中,与MySQL 5.6.13完全相同的测试确实存储了两种情况下的毫秒数。