MySQL - Передача меток времени UTC в sprocs через JDBC - PullRequest
0 голосов
/ 19 января 2011

У меня для MySQL Server установлено UTC (@@ global.time_zone = '+00: 00') и таблица со столбцом DATETIME, в которой я храню даты в UTC. У меня проблемы с получением дат UTC, когда я вызываю хранимую процедуру через JDBC. Пример:

java.util.Date now = new java.util.Date();
sproc = conn.prepareCall("{call TzTestInsert(?)}");
sproc.setTimestamp(1, new java.sql.Timestamp(now.getTime()), Calendar.getInstance(TimeZone.getTimeZone("GMT+00:00")));
sproc.execute();

Спрокер TzTestInsert просто берет DATETIME и вставляет его в таблицу.

Я бы ожидал, что база данных будет содержать мое текущее время в UTC, но на самом деле оно содержит текущее время для моего часового пояса.

Если я изменю sproc на строку, это сработает ...

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
...
sproc.setString(1, dateFormat.format(now));

но я бы предпочел использовать правильный тип в sproc.

Также работает, если я обойду sproc, но опять же не мое предпочтительное решение ...

String sql = "INSERT INTO TzTest VALUES('" + dateFormat.format(now) + "') ;

С исходным sproc у меня возникает та же проблема, если я использую тип данных TIMESTAMP в sproc и таблице, что неудивительно для сервера в UTC, поскольку любые преобразования часовых поясов, специфичные для MySQL TIMESTAMP, должны быть noops.

Вызов sproc из соединения MySQL Workbench работает нормально, например,

CALL TzTestInsert(UTC_TIMESTAMP());

Похоже, проблема в JDBC. Я просмотрел различные параметры подключения к часовому поясу и не нашел ничего, что имело бы значение.

Я, должно быть, упускаю что-то простое - многие люди делают это, верно?

1 Ответ

0 голосов
/ 19 января 2011

Решением было передать драйвер JDBC "useLegacyDatetimeCode = false".См. Mysql bug http://bugs.mysql.com/bug.php?id=15604

Похоже, они оставили старый код в драйвере для обратной совместимости.

...