Quelques antécédents:
J'ai une application Web Java 1.6 exécutée sur Tomcat 7. La base de données est MySQL 5.5. Auparavant, j'utilisais le pilote Mysql JDBC 5.1.23 pour me connecter à la base de données. Tout fonctionnait. J'ai récemment mis à niveau le pilote Mysql JDBC 5.1.33. Après la mise à niveau, Tomcat lançait cette erreur lors du démarrage de l'application.
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.
Pourquoi cela arrive-t-il?
Réponses:
Apparemment, pour que la version 5.1.33 du pilote MySQL JDBC fonctionne avec le fuseau horaire UTC, il faut spécifier
serverTimezone
explicitement la chaîne de connexion.la source
J'ai résolu ce problème en configurant MySQL.
SET GLOBAL time_zone = '+3:00';
la source
jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Moscow
. Il semble que mysql-connector ne comprenne pas les noms courts de fuseau horaire.Après avoir lu plusieurs articles sur ce sujet, testé différentes configurations et basé sur quelques aperçus de ce fil de bogue mysql c'est ce que j'ai compris:
useLegacyDatetimeCode=true
, ce qui, conjointement avec,useJDBCCompliantTimezoneShift=true
ferait en sorte que l'application obtienne le fuseau horaire de la base de données à chaque connexion. Dans ce mode, les fuseaux horaires GMT tels que «British Summer Time» seraient convertis au format interne java / JDBC. De nouveaux fuseaux horaires pourraient être définis dans un fichier .properties tel que celui-ciuseJDBCCompliantTimezoneShift
) et le format d'heure hérité (useLegacyDatetimeCode
) ont été supprimés ( voir le changelog du connecteur mysql jdbc ). donc la définition de ces 2 paramètres n'a aucun effet car ils sont complètement ignorés (la nouvelle valeur par défaut estuseLegacyDateTimeCode=false
)serverTimezone
est devenu obligatoire si l'un des fuseaux horaires (serveurs d'application / de base de données) n'est pas au format 'UTC + xx' ou 'GMT + xx'jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, même si vos serveurs d'application / de base de données ne se trouvent pas dans ce fuseau horaire. L'important est que la chaîne de connexion de l'application + la base de données soient synchronisées avec le même fuseau horaire. En d'autres termes , simplement définir serverTimezone = UTC avec un fuseau horaire différent sur le serveur de base de données décalera toutes les dates extraites de la base de donnéesdefault-time-zone='+00:00'
(détails dans ce post StackOverflow )la source
default-time-zone = '+00:00'
dans le/usr/local/etc/my.cnf
fichier homebrew . Il semble que les espaces autour de l '=
soient importants mais vous pouvez donc modifier cette puce pour les inclure.Si vous utilisez Maven, vous pouvez simplement définir une autre version du connecteur MySQL (j'ai eu la même erreur, j'ai donc changé de 6.0.2 à 5.1.39) dans
pom.xml
:Comme indiqué dans une autre réponse, ce problème a été corrigé dans les versions 6.0.3 ou supérieures, vous pouvez donc utiliser la version mise à jour:
Maven reconstruira automatiquement votre projet après avoir enregistré le
pom.xml
fichier.la source
6.0.6
encore. préférable d'utiliser la solution ci-dessusLa chaîne de connexion doit être définie comme ceci:
Si vous définissez la connexion dans un
xml
fichier ( par exemplepersistence.xml
,standalone-full.xml
, etc ..), au lieu de&
vous devez utiliser&
ou utiliser unCDATA
bloc.la source
Il s'agit d'un bogue dans mysql-connector-java de la version 5.1.33 à 5.1.37. Je l'ai signalé ici: http://bugs.mysql.com/bug.php?id=79343
Modifié: cela a été corrigé depuis mysql-connector-java 5.1.39
Il s'agissait d'une faute de frappe dans la classe TimeUtil de la méthode loadTimeZoneMappings qui déclenche un fichier NPE localisant /com/mysql/jdbc/TimeZoneMapping.properties. Si vous regardez le code, le fichier doit se trouver dans le chargeur de classe TimeUtil, pas TimeZone:
Le paramètre useLegacyDatetimeCode permet de corriger automatiquement la différence entre les fuseaux horaires client et serveur lors de l'utilisation des dates. Cela vous aide donc à ne pas avoir à spécifier de fuseaux horaires dans chaque partie. Bien que l'utilisation du paramètre serverTimeZone soit une solution de contournement, et pendant ce temps, le correctif est publié, vous pouvez essayer de mieux corriger le code par vous-même comme je l'ai fait.
S'il s'agit d'une application autonome, vous pouvez simplement essayer d'ajouter une classe com / mysql / jdbc / TimeUtil corrigée à votre code et faire attention à l'ordre de chargement des fichiers. Cela peut aider: https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html
S'il s'agit d'une application Web, la solution la plus simple consiste à créer votre propre mysql-connector-java-5.1.37-patched.jar, en remplaçant le .class directement dans le bocal d'origine.
la source
TimeZone.getAvailableIDs()
ni dans,TimeZoneMapping.properties
donc cette solution n'aidera pas ici. La solution serait probablement mise en place commeserverTimezone=Europe/Berlin
J'ai résolu de mettre la chaîne de connexion ci-dessous dans l'URL
la source
Cela a fonctionné pour moi simplement en ajoutant serverTimeZone = UTC sur application.properties.
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC
la source
J'ai ajouté dans le fichier de configuration mysql dans la section [mysqld]
Et redémarrez le serveur mysql:
Où +03: 00 mon fuseau horaire UTC.
Chemin d'accès au fichier de configuration sur mon os ubuntu 16.04:
AVERTISSEMENT: SI VOTRE FUSEAU HORAIRE A DES HEURES D'ÉTÉ ET D'HIVER. VOUS DEVEZ MODIFIER L'UTC DANS LA CONFIGURATION SI VOUS CHANGEZ D'HEURE. DEUX FOIS DANS L'ANNÉE (HABITUELLEMENT) OU DÉFINIR CRONTAB AVEC SUDO.
Ma connexion URL jdbc:
la source
default-time-zone='+03:00'
place, selon cette réponse . Venant également de DBeaver.J'ai le même problème et je l'ai résolu, ajoutez seulement "? ServerTimezone = UTC" à ma connexion de chaîne.
#sinossi mon problème:
java.sql.SQLException: la valeur de fuseau horaire du serveur 'CEST' n'est pas reconnue ou représente plusieurs fuseaux horaires. Vous devez configurer le serveur ou le pilote JDBC (via la propriété de configuration serverTimezone) pour utiliser une valeur de fuseau horaire plus spécifique si vous souhaitez utiliser la prise en charge du fuseau horaire.
la source
Le programme ci-dessus générera cette erreur de fuseau horaire.
Après le nom de votre base de données , vous devez ajouter ceci:
?useTimezone=true&serverTimezone=UTC
. Une fois que vous avez terminé, votre code fonctionnera correctement.Bonne chance :)
la source
J'ai exécuté le suivi du côté de ma base de données.
J'utilise la version du serveur: 8.0.17 - MySQL Community Server - GPL
source: https://community.oracle.com/thread/4144569?start=0&tstart=0
la source
Tout ce dont nous avons besoin pour résoudre le problème
serverTimezone
:la source
Vous pouvez utiliser le connecteur MySQL dans la dépendance Maven,
Ensuite, vous devez définir les bons paramètres dans le
application.properties
fichier,la source
J'utilise mysql-connector-java-8.0.13 et j'ai eu le même problème. J'ai créé ma base de données dans la console de ligne de commande et résolu ce problème en utilisant la solution de @Dimitry Rud sur la ligne de commande:
Je n'avais pas besoin de redémarrer quoi que ce soit, de régler l'heure et d'exécuter immédiatement mon code dans Eclipse, il se connectait sans problème.
Le bogue est censé être corrigé dans une ancienne version, mais je pense avoir eu cette erreur car après avoir créé la base de données dans la console, je n'ai pas réglé cela. Je n'utilise pas Workbench ni une autre application pour gérer cela plutôt que la console.
la source
Depuis mysql workbench, exécutez les instructions sql suivantes:
avec les instructions sql suivantes, vérifiez si les valeurs ont été définies:
SELECT @@ global.time_zone, @@ session.time_zone;
la source
Cela a fonctionné pour moi.
sur DBeaver 6.0: accédez à Paramètres de connexion> Propriétés du pilote> Fuseau horaire du serveur> Définir UTC.
En outre, dans la configuration de démarrage de printemps, a dû définir la propriété ci-dessous.
jdbc: mysql: // localhost: /? serverTimezone = UTC
la source
Apparemment, pour que la version 5.1.33 du pilote MySQL JDBC fonctionne avec le fuseau horaire UTC, il faut spécifier explicitement le serverTimezone dans la chaîne de connexion.
la source
J'avais aussi exactement le même problème dans LibreOffice Base. Je viens donc de spécifier un «fuseau horaire sans heure d'été» dans la chaîne de connexion.
J'ai essayé sans le "& serverTimezone = MST" mais cela a également échoué.
J'ai également essayé "& serverTimezone = MDT" et cela a échoué, donc pour une raison quelconque, il n'aime pas l'heure d'été!
la source
J'ai eu le même problème lorsque j'essaie de travailler avec le projet Spring Boot sur Windows.
L'URL de la source de données doit être:
spring.datasource.url=jdbc:mysql://localhost/database?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
la source
Exécutez la requête ci-dessous vers mysql DB pour résoudre l'erreur
la source
J'ai une erreur similaire à la vôtre, mais ma valeur de fuseau horaire du serveur est 'Afr. centrale Ouest 'donc j'ai fait ces étapes:
MyError (sur IntelliJ IDEA Community Edition):
J'ai rencontré ce problème lorsque j'ai mis à niveau mon serveur mysql vers SQL Server 8.0 (MYSQL80).
La solution la plus simple à ce problème est d'écrire simplement la commande ci-dessous dans votre MYSQL Workbench -
La valeur après le fuseau horaire sera égale à GMT +/- Différence dans votre fuseau horaire. L'exemple ci-dessus concerne l'Afrique du Nord (GMT + 1: 00) / ou l'Inde (GMT + 5: 30). Cela résoudra le problème.
Entrez le code suivant dans votre MySQL Workbench et exécutez la requête
[lien source pour question / problème]
[lien source pour la réponse]
[Capture d'écran de la solution]
la source
C'est en fait la solution à ce problème, mais ne vous contentez pas de le copier-coller dans votre programme. Si vous venez de lire la ligne, vous trouverez «resultout», c'est le nom de ma base de données, et vous devez écrire le vôtre.
Il existe trois composants de chaîne, le premier est l'URL, le deuxième est le nom d'utilisateur et le troisième est le mot de passe. Dans le paragraphe ci-dessus, nous avons effacé, url. Les deuxième et troisième composants String comme dit votre nom d'utilisateur et votre mot de passe, vous devez les modifier en conséquence.
Merci
la source
J'ai résolu ce problème sans aucun changement de code unique. passez simplement à l'heure du système et définissez le fuseau horaire. Dans mon cas, le fuseau horaire par défaut était UTC que j'ai changé pour mon fuseau horaire local. Après avoir redémarré tous les services, tout a fonctionné pour moi.
la source
Je suis en retard, mais si vous rencontrez l'erreur suivante et utilisez la source de données (javax.sql.DataSource):
Définissez la ligne suivante pour supprimer l'erreur:
la source
Dans mon cas, c'était un environnement de test et j'ai dû faire fonctionner une application existante sans aucun changement de configuration, et si possible sans aucun changement de configuration MySQL. J'ai pu résoudre le problème en suivant la suggestion de @vinnyjames et en changeant le fuseau horaire du serveur en UTC :
Cela m'a suffi pour résoudre le problème.
la source
J'ai ajouté la ligne suivante à mon
/etc/mysql/my.cnf
fichier:Redémarrage du serveur MySQL:
Et cela fonctionne comme un charme.
la source
La définition de l'heure du serveur sur UTC n'a aucun impact (par exemple avec
jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, même si vos serveurs d'application / de base de données ne se trouvent pas dans ce fuseau horaire. L'important est que la chaîne de connexion de l'application + la base de données soient synchronisées avec le même fuseau horaire.En d'autres termes, le simple fait de définir
serverTimezone=UTC
un fuseau horaire différent sur le serveur de base de données décale toutes les dates extraites de la base de donnéesla source
D'accord avec la réponse @bluecollarcoder, mais il est préférable d'utiliser
TimeZone.getDefault().getID();
à la fin de la chaîne de connexion:Dans ce cas, le
Timezone
paramètre est automatiquement mis à jour en fonction du fuseau horaire de la machine locale.la source
Modifiez simplement la chaîne de connexion avec le code suivant dans le fichier application.properties.
la source