Немного предыстории:
У меня есть веб-приложение Java 1.6, работающее на Tomcat 7. База данных MySQL 5.5. Ранее я использовал драйвер Mysql JDBC 5.1.23 для подключения к БД. Все работало Я недавно обновил до Mysql JDBC драйвер 5.1.33. После обновления Tomcat выдаст эту ошибку при запуске приложения.
WARNING: Unexpected exception resolving reference
java.sql.SQLException: The server timezone value 'UTC' is unrecognized or represents more than one timezone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc timezone value if you want to utilize timezone support.
Почему это происходит?
Ответы:
Очевидно, чтобы заставить версию 5.1.33 драйвера JDBC MySQL работать с часовым поясом UTC, необходимо
serverTimezone
явно указать в строке соединения.источник
Я решил эту проблему, настроив MySQL.
SET GLOBAL time_zone = '+3:00';
источник
jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Moscow
. Похоже, MySQL-разъем не понимает короткие имена часовых поясов.Прочитав несколько постов на эту тему, протестировав различные конфигурации и основываясь на некоторых выводах из этой ветки ошибок MySQL , я понял следующее:
useLegacyDatetimeCode=true
, что в сочетании с этимuseJDBCCompliantTimezoneShift=true
заставляло бы приложение получать часовой пояс базы данных при каждом соединении. В этом режиме часовые пояса GMT, такие как «Британское летнее время», будут преобразованы во внутренний формат Java / JDBC. Новые часовые пояса могут быть определены в файле .properties, таком как этотuseJDBCCompliantTimezoneShift
) и устаревший формат времени (useLegacyDatetimeCode
) были удалены ( см. Список изменений в соединителе jdbc для mysql ). поэтому установка этих двух параметров не имеет никакого эффекта, поскольку они полностью игнорируются (новое значение по умолчанию -useLegacyDateTimeCode=false
)serverTimezone
стала обязательной, если какой-либо из часовых поясов (серверы приложений / баз данных) не в формате «UTC + xx» или «GMT + xx»jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, даже если ваши серверы приложений / баз данных не находятся в этом часовом поясе. Важно, чтобы строка подключения приложения + база данных были синхронизированы с одним и тем же часовым поясом. Другими словами , просто установив serverTimezone = UTC с другим часовым поясом на сервере базы данных сместятся любые даты , извлеченных из базы данныхdefault-time-zone='+00:00'
(подробности в этом сообщении StackOverflow )источник
default-time-zone = '+00:00'
в доморощенный/usr/local/etc/my.cnf
файл. Кажется, что пробелы вокруг=
важны, поэтому вы можете отредактировать этот маркер, чтобы включить их.Если вы используете Maven, вы можете просто установить другую версию коннектора MySQL (у меня была такая же ошибка, поэтому я изменил с 6.0.2 до 5.1.39) в
pom.xml
:Как сообщалось в других ответах, эта проблема была исправлена в версиях 6.0.3 или выше, поэтому вы можете использовать обновленную версию:
Maven автоматически перестроит ваш проект после сохранения
pom.xml
файла.источник
6.0.6
неподвижным. Лучше использовать вышеуказанное решениеСтрока подключения должна быть установлена следующим образом:
Если вы определяете соединение в
xml
файле (напримерpersistence.xml
,standalone-full.xml
и т. Д.), Вместо этого&
вы должны использовать&
или использоватьCDATA
блок.источник
Это ошибка в mysql-connector-java с версии 5.1.33 до 5.1.37. Я сообщил об этом здесь: http://bugs.mysql.com/bug.php?id=79343
Отредактировано: это было исправлено в mysql-connector-java 5.1.39
Это была опечатка в классе TimeUtil в методе loadTimeZoneMappings, которая вызвала NPE, которая обнаружила файл /com/mysql/jdbc/TimeZoneMapping.properties. Если вы посмотрите на код, файл должен находиться в загрузчике класса TimeUtil, а не в TimeZone:
Параметр useLegacyDatetimeCode позволяет автоматически корректировать разницу между часовыми поясами клиента и сервера при использовании дат. Так что это поможет вам точно не указывать часовые пояса в каждой части. Хотя использование параметра serverTimeZone является обходным решением , и тем временем патч выпущен, вы можете попробовать исправить код самостоятельно, как я.
Если это отдельное приложение, вы можете просто попытаться добавить исправленный класс com / mysql / jdbc / TimeUtil к своему коду и соблюдать порядок загрузки jar. Это может помочь: https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html
Если это веб-приложение, более простое решение - создать собственный mysql-connector-java-5.1.37-patched.jar, подставив .class непосредственно в исходный jar.
источник
TimeZone.getAvailableIDs()
ни в,TimeZoneMapping.properties
так что это решение здесь не поможет. Решение будет probaby быть установка , какserverTimezone=Europe/Berlin
Я решил положить ниже строку подключения в URL
источник
Это сработало для меня, просто добавив serverTimeZone = UTC в application.properties.
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC
источник
Я добавил в конфигурационный файл mysql в разделе [mysqld]
И перезапустите сервер MySQL:
Где +03: 00 мой часовой пояс UTC.
Путь к файлу конфигурации на моей ОС Ubuntu 16.04:
ВНИМАНИЕ: ЕСЛИ В ВАШЕЙ ЗОНЕ ВРЕМЕНИ ИМЕЕТ ЛЕТО И ЗИМНЕЕ ВРЕМЯ. ВЫ ДОЛЖНЫ ИЗМЕНИТЬ UTC В КОНФИГ. ЕСЛИ ВРЕМЯ ИЗМЕНЕНИЯ. ДВАЖДЫ В ГОД (ОБЫЧНО) ИЛИ УСТАНАВЛИВАЙТЕ CRONTAB С SUDO.
Мой URL JDBC соединение:
источник
default-time-zone='+03:00'
вместо этого, согласно этому ответу . Также идет от DBeaver.У меня та же проблема, и я решил ее добавить только «? ServerTimezone = UTC» к моему строковому соединению.
#Синосси моя проблема:
java.sql.SQLException: значение часового пояса сервера 'CEST' не распознано или представляет более одного часового пояса. Необходимо настроить сервер или драйвер JDBC (через свойство конфигурации serverTimezone), чтобы использовать более конкретное значение часового пояса, если вы хотите использовать поддержку часового пояса.
источник
Приведенная выше программа сгенерирует эту ошибку часового пояса.
После того, как ваше имя базы данных нужно добавить следующее:
?useTimezone=true&serverTimezone=UTC
. После того как вы сделали ваш код будет работать нормально.Удачи :)
источник
Я выполнил следующее на моей стороне базы данных.
Я использую версию сервера: 8.0.17 - MySQL Community Server - GPL
источник: https://community.oracle.com/thread/4144569?start=0&tstart=0
источник
Все, что нам нужно, чтобы решить проблему с
serverTimezone
:источник
Вы можете использовать коннектор MySQL в зависимости Maven,
Затем вам нужно установить правильные параметры в
application.properties
файле,источник
Я использую mysql-connector-java-8.0.13 и была такая же проблема. Я создал свою базу данных в консоли командной строки и решил эту проблему, используя решение @Dimitry Rud в командной строке:
Мне не нужно было ничего перезапускать, устанавливать время и немедленно запускать мой код в затмении, это без проблем.
Ошибка должна быть исправлена в более старой версии, но я думаю, что я получил эту ошибку, потому что после того, как я создал базу данных в консоли, я не установил ее. Я не использую верстак или другое приложение для управления этим, а не консоль.
источник
Из mysql workbench запустите следующие операторы sql:
с помощью следующих операторов sql проверьте, были ли установлены значения:
SELECT @@ global.time_zone, @@ session.time_zone;
источник
Это сработало для меня.
на DBeaver 6.0: выберите «Параметры подключения»> «Свойства драйвера»> «Часовой пояс сервера»> «Установить UTC».
Также, в весеннем загрузочном конфиге, пришлось установить свойство ниже.
JDBC: MySQL: // локальный: / serverTimezone = UTC
источник
По-видимому, чтобы заставить версию 5.1.33 драйвера JDBC MySQL работать с часовым поясом UTC, необходимо явно указать serverTimezone в строке подключения.
источник
У меня тоже была точно такая же проблема в LibreOffice Base. Поэтому я просто указал не «часовой пояс для летнего времени» в строке подключения.
Я попытался без "& serverTimezone = MST", но это также не удалось.
Я также попытался "& serverTimezone = MDT", и это не удалось, поэтому по некоторым причинам он не любит летнее время!
источник
У меня была такая же проблема, когда я пытаюсь работать с проектом весенней загрузки на Windows.
URL источника данных должен быть:
spring.datasource.url=jdbc:mysql://localhost/database?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
источник
Запустите приведенный ниже запрос к базе данных mysql, чтобы устранить ошибку
источник
Я получил ошибку, похожую на вашу, но мой Значение часового пояса сервера 'Afr. Centrale Ouest ', поэтому я сделал эти шаги:
MyError (в версии IntelliJ IDEA Community Edition):
Я столкнулся с этой проблемой, когда обновил свой сервер MySQL до SQL Server 8.0 (MYSQL80).
Самое простое решение этой проблемы - просто напишите приведенную ниже команду в вашем MYSQL Workbench -
Значение после часового пояса будет равно GMT +/- Разница в вашем часовом поясе. Приведенный выше пример для Северной Африки (GMT + 1: 00) / или для Индии (GMT + 5: 30). Это решит проблему.
Введите следующий код в Mysql Workbench и выполните задание
[исходная ссылка на вопрос / проблему]
[ссылка на источник для ответа]
[Решение ScreenShot]
источник
На самом деле это решение этой проблемы, но не просто скопируйте и вставьте ее в свою программу. Если вы просто прочитаете строку, вы найдете «resultout», это имя моей базы данных, и вы должны написать свою.
Существует три строковых компонента: первый - это URL, второй - имя пользователя, а третий - пароль. В вышеприведенном абзаце мы очистили, URL. Второй и третий строковые компоненты, как указано ваше имя пользователя и пароль, вы должны изменить соответствующим образом.
Спасибо
источник
Я решил эту проблему без единого изменения кода. просто зайдите в настройку системного времени и установите часовой пояс. В моем случае часовой пояс по умолчанию был UTC, который я изменил на свой местный часовой пояс. После перезапуска всех служб у меня все заработало.
источник
Я опаздываю, но если вы боретесь со следующей ошибкой и используете источник данных (javax.sql.DataSource):
Установите следующую строку, чтобы избавиться от ошибки:
источник
В моем случае это была тестовая среда, и мне пришлось заставить существующее приложение работать без каких-либо изменений конфигурации и, если возможно, без каких-либо изменений конфигурации MySQL. Мне удалось решить эту проблему, следуя предложению @vinnyjames и изменив часовой пояс сервера на UTC :
Этого было достаточно для решения проблемы.
источник
Я добавил следующую строку в мой
/etc/mysql/my.cnf
файл:Перезапустил сервер MySQL:
И это работает как шарм.
источник
Установка времени сервера как UTC не влияет (например
jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, даже если ваши серверы приложений / баз данных не находятся в этом часовом поясе. Важно, чтобы строка подключения приложения + база данных были синхронизированы с одним и тем же часовым поясом.Другими словами, простая установка
serverTimezone=UTC
другого часового пояса на сервере базы данных сместит любые даты, извлеченные из базы данных.источник
Согласитесь с ответом @bluecollarcoder, но лучше использовать
TimeZone.getDefault().getID();
в конце строки подключения:В этом случае
Timezone
параметр автоматически обновляется в зависимости от часового пояса локальной машины.источник
Просто измените строку подключения с помощью следующего кода в файле application.properties.
источник