IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Exception MYSQL : troncation sur une date


Sujet :

JDBC Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut Exception MYSQL : troncation sur une date
    Bonjour,

    Depuis que j'ai installé MySQL version 10.4.17 , java 8.0.281-B09 et le nouveau connecteur mysql-connector-java-5.1.49.jar, j'ai un problème de compatibilité.
    Bien que j'ai défini l'option zeroDateTimeBehavior=convertToNull, j'obtiens une SQLException.

    La colonne DateReprise est définie en (DATE,NULL, nullable);

    J'ai remarqué que si je lançais le programme de la façon suivante :**

    java -cp .;c:\jars\mysql-connector-java-5.1.49.jar;cinephil.jar cinephil.Test
    j'obtiens l'exception suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: '0000-00-00' for column `cinephil`.`films`.`DateReprise` at row 1
            at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3931)
            at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3869)
            at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524)
            at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2675)
            at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)
            at com.mysql.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1536)
            at com.mysql.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2585)
            at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1464)
            at cinephil.Test.process(Test.java:26)
            at cinephil.Test.<init>(Test.java:13)
            at cinephil.Test.main(Test.java:34)
       Terminé
    par contre si je place dans le Classpath un ancien mysql.jar (2014) même avec le nouveau connecteur,
    java -cp .;c:\jars\mysql.jar;c:\jars\mysql-connector-java-5.1.49.jar;cinephil.jar cinephil.Test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Ceci a bien marché.
     Terminé
    J'ai vérifié, dans la table il y a bien 0000-00-00.

    Ceci me fait penser que le package java.sql qui se trouve dans rt.jar n'est pas correct. Mais je n'en suis pas certain.
    Qu'en pensez vous ?

    Merci d'avance.

    Gérard


    Ci-dessous mon programme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     package cinephil;
     
    public class Test    
    {  
    	public static java.sql.Connection  cnx 	= null;
     
    	public Test() 
    	{
    		process();
    	}
     
    	private   void process()
    	{
    		try
    		{  
    			String url	= "jdbc:mysql://localhost/Cinephil?zeroDateTimeBehavior=convertToNull";  	
    			String driver 	=	"com.mysql.jdbc.Driver";   			 
    			String admin 	=	"gege";   			 
    			String pw      =	"";
    		//  on charge le driver de base de données" ;
    			Class.forName (driver).newInstance();
    			// On réalise une connexion à la source de données  sans mot de passe
    			cnx = java.sql.DriverManager.getConnection(url,admin,pw );
    			String requete = "update cinephil.films set DateReprise ='0000-00-00' where no_film=6050";
    			java.sql.Statement stmt	=  cnx.createStatement();
    			stmt.executeUpdate(requete);
    			 System.out.println("Ceci a bien marché.");
    		}
    	    catch (Exception ex) {ex.printStackTrace() ;}   
        }
     
     
    	public static void main(String[] args) 
    	{
    	  new Test(); 
    	  System.out.println("Terminé");
    	  System.exit(0);
    	}
    }

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    L'exception est due au mode slq qui peut être le mode strict.
    D'après la documentation Le mode strict détermine si le serveur autorise la valeur '0000-00-00' comme date valide ou non.

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Je n'utilise plus MySQL donc difficile de dire s'il y a un contournement au problème mais si je peux me permettre, c'est une très mauvaise idée de mettre une date 000-00-00, ce n'est pas une date valide.
    Il serait préférable de la positionner à NULL quand il n'y a pas de date (comme dans ce cas à priori).

    Le fait de visualiser dans un outil de requêtes une valeur 0000-00-00 ne veut pas forcément dire qu'on a effectivement cette valeur dans la DB, c'est peut-être un formatage qui l'affiche ainsi.

    Dans tous les cas, la colonne étant définie nullable, il faudrait plutôt faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String requete = "update cinephil.films set DateReprise = null where no_film=6050";
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Merci pour ces réponses, effectivement j'en étais arrivé aux mêmes conclusions. J'ai modifié toutes les parties de codes dans lesquelles je définissais (ou retrouvais) la valeur 0000-00-00 pour changer en (ou tester) la valeur " NULL"
    Toutefois, je me demande maintenant à quoi sert l'indication : zeroDateTimeBehavior=convertToNull

    Merci encore

    Gérard

Discussions similaires

  1. exception sur une date
    Par DJERDJAR YACINE dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 30/07/2007, 14h20
  2. requette sur une date
    Par AlphonseBrown dans le forum Langage SQL
    Réponses: 13
    Dernier message: 04/04/2005, 12h41
  3. Travailler sur une date
    Par HqX dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/10/2004, 15h54
  4. Problème lors d'un Update sur une date
    Par Nany dans le forum ASP
    Réponses: 3
    Dernier message: 19/05/2004, 22h37
  5. [SQL] Conditions sur une date dans une requete
    Par poufouille dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/03/2004, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo