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 éclairé
    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
    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
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 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 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    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 éclairé
    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
    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