Мы перенесли наше приложение с MySQL 5.1.6 на MySQL 8.0.16
При извлечении столбца метки времени с сервера MySQL 8 с использованием mysql -connector- java jdb * Драйвер 1041 * (версия 8.0.18, 8.0.19), мы получаем неправильное значение для значения даты, которое находится в летнее время (DST).
На нашем сервере размещено java приложение & MySQL база данных находится в EST.
Здесь у нас есть столбец created_date
, имеющий тип datetime. Он имеет значение '2020-03-17 23:01:54' для указанной строки c. При извлечении тех же данных через JDB C как:
Timestamp timestamp = resultSet.getTimestamp("created_date");
мы получаем значение как 2020-03-18 00: 01: 54.0, т.е. применяется DST.
Существует известная ошибка в MySQL: https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-usagenotes-known-issues-limitations.html
Предлагается использовать дополнительный параметр в jdb c url serverTimezone = UT C. Но мы не можем использовать UT C, потому что мы хотим использовать спецификацию развертывания c timezone в нашем приложении / базе данных.
Примечание. Мы не сталкивались с этой проблемой при MySQL 5.1.
Дополнительное обновление: при вставке данных в базу данных, если я использую jdb c url с параметром serverTimezone = UT C, то при получении столбца метки времени получаю правильное значение.
Похоже, что с serverTimezone = UT C, драйвер JDB C не применяет DST при сохранении отметки времени в базе данных. Поэтому предложенный обходной путь (т. Е. ServerTimezone = UT C), похоже, работает.
Но если я вставляю данные с помощью команды «Загрузить данные локального файла», используя JDB C url, содержащий serverTimezone = UT C, т. Е.
PreparedStatement stmt = connection.prepareStatement("LOAD DATA LOCAL INFILE.....")
, кажется, флаг serverTimezone = UT C игнорируется, и данные сохраняются со значением метки времени, примененным DST. Таким образом, при получении метки времени мы получаем неправильное значение.
Оцените любые предложения.