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

Requêtes MySQL Discussion :

Truncated incorrect time value


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué

    Inscrit en
    Février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 342
    Points : 197
    Points
    197
    Par défaut Truncated incorrect time value
    j'ai une procédure stockée qui effectue une operation telle que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE time_reporting_table SET temps = temps + var_temps WHERE id = var_id
    Dans cette table time_reporting_table (table de type myIsam), le champ temps est défini comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TIME NOT NULL DEFAULT '00:00:00'
    une fois passée la procédure stockée en prod, j'ai observé sur certains appels l'erreur mysql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Truncated incorrect time value: '1095:16:32'
    Après consultation dans la doc, effectivement la valeur max du type TIME est de +/- 838:59:59
    source:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mysql> select TIME('1000:00:00');
    +--------------------+
    | TIME('1000:00:00') |
    +--------------------+
    | 838:59:59          |
    +--------------------+
    1 row in set, 1 warning (0.00 sec)
     
    mysql>
    Donc si on appelle la procédure stockée en question en essayant d'ajouter 10 minutes alors que la colonne contient par exemple 838:55:59, la somme des deux temps va dépasser le max, donc mysql va être obligé de tronquer à 838:59:59. donc avertissement. etc.

    ==> jusque là : pas de question.

    ce que je ne comprends pas bien, c'est que j'avais bien anticipé cette source d'erreur et j'ai même fait des tests unitaires exposant cette limitation. Or les tests unitaires ne lèvent pas d'exception (la valeur est silencieusement tronquée). Par contre, en prod j'ai une erreur qui a pour effet que l'insertion échoue (pas de temps ajouté) au lieu d’être silencieusement tronquée à 838:59:59

    Les droits mysql du user qui crée les procédures stockées, qui les exécute, sont les mêmes en prod et en test.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GRANT ALL PRIVILEGES ON `madatabase`.* TO 'monuser'@'%' WITH GRANT OPTION
    c'est le même nom de user en test et en prod (mais pas le mm server (windows VS linux) + pas la mm version de mysqld et pas le même nom de base)
    lorsque je recharge la base de prod dans la base test (en prenant soin de virer les directive DEFINER= de la création de procédure stockée)
    ==> je répète le comportement en test. à ce stade, si je relance mes scripts de création de procédure stockée sur l'environnement de test, l'erreur disparait à nouveau.
    ==> même en relançant en prod mes commandes SQL de création de procédures stockées, je n'arrive pas à me débarrasser de l'erreur

    j'ai cherché dans les variables de session, qqch qui pourrait expliquer par exemple qu'un warning soit considéré comme une erreur. A l’exception de sql_mode (voir plus bas), je n'ai rien trouvé.
    Je viens de repasser toute la faq mysq de dvp sans succès.
    J'ai cherché dans le forum, à part http://www.developpez.net/forums/d98...alue-avg-time/ qui ne répond pas à mon problème ==> rien trouvé.

    ma question: qu'est-ce qui peut expliquer ce comportement? (troncature silencieusement effectuée VERSUS erreur)

    je pense à STRICT_TRANS_TABLES mais dans ce cas, pourquoi le reload des procédures fait disparaitre l'erreur en test mais pas en prod???



    qqs info d'environnement
    PROD
    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
    mysql> select version();
    +---------------------+
    | version()           |
    +---------------------+
    | 5.0.67-community-nt |
    +---------------------+
    1 row in set (0.00 sec)
     
    mysql> SELECT @@GLOBAL.sql_mode;
    +----------------------------------------------------------------+
    | @@GLOBAL.sql_mode                                              |
    +----------------------------------------------------------------+
    | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
    +----------------------------------------------------------------+
    1 row in set (0.00 sec)
     
    mysql> SELECT @@SESSION.sql_mode;
    +----------------------------------------------------------------+
    | @@SESSION.sql_mode                                             |
    +----------------------------------------------------------------+
    | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
    +----------------------------------------------------------------+
    1 row in set (0.00 sec)
    TEST
    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
    mysql> select version();
    +---------------------+
    | version()           |
    +---------------------+
    | 5.1.41-3ubuntu12.10 |
    +---------------------+
    1 row in set (0.00 sec)
     
    mysql> SELECT @@GLOBAL.sql_mode;
    +-------------------+
    | @@GLOBAL.sql_mode |
    +-------------------+
    |                   |
    +-------------------+
    1 row in set (0.00 sec)
     
    mysql> SELECT @@SESSION.sql_mode;
    +--------------------+
    | @@SESSION.sql_mode |
    +--------------------+
    |                    |
    +--------------------+
    1 row in set (0.00 sec)

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 039
    Points : 23 787
    Points
    23 787
    Par défaut
    Bonjour,

    Ton environnement de production est en 5.0, alors que ton environnement de test est en 5.1.
    Si tu repasses ton environnement de test en 5.0, est-ce que tu obtiens le même comportement qu'en prod ?

    Pour moi, la réponse est très certainement là...

  3. #3
    Membre habitué

    Inscrit en
    Février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 342
    Points : 197
    Points
    197
    Par défaut
    mmm.. je vais la tenter pour voir.

    de tte facon, le moyen le plus simple et le plus sur est tout simplement de cesser d'utiliser un type (TIME) dont je sais que les valeurs limites ne matchent pas avec les valeurs effectivement rencontrées. par exemple utiliser INT et compter des secondes

    par contre changer de type va me casser bcp de trucs à coté, je vais avoir pas mal de maintenance sur les tests. mais au fond, tout ca est acceptable. je n'avais qu'à mieux anticiper c'est tout.

    ce qui me gene surtout c'est de faire face à une erreur sans pouvoir l'expliquer les différences de comportement. ca ca craint vraiment.

    ps: oui je sais c'est pas bien d'avoir des environnements de test & prod différents. je n'ai pas eu le choix c'est tout :'(

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par fourchette Voir le message

    ce qui me gene surtout c'est de faire face à une erreur sans pouvoir l'expliquer les différences de comportement. ca ca craint vraiment.
    Mais tu l'as trouvé l'explication, c'est sql_mode, pourquoi aller chercher ailleurs?

  5. #5
    Membre habitué

    Inscrit en
    Février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 342
    Points : 197
    Points
    197
    Par défaut
    Citation Envoyé par estofilo Voir le message
    Mais tu l'as trouvé l'explication, c'est sql_mode, pourquoi aller chercher ailleurs?
    si je recharge un mysqldump de prod sur le mysqld de test. (cat backup_prod.sql | mysql bla bla bla)
    NB: je passe le dump à sed pour lui virer les DEFINER=bidule sinon j'ai d'autres problemes par ailleurs

    ==> je reproduis le probleme sur l'environnement de test, malgré le sql_mode vide en test contre mis à STRICT_TRANS_TABLES en prod

    1. déjà là je ne comprends pas. pour moi le comportement attendu c'est que l'erreur ne se reproduit pas du tout en test vu qu'il n'y a pas le STRICT_TRANS_TABLES

    A ce stade, si je remet toutes mes fichiers.sql contenant les procédures stockées sur mon mysqld de test. (cat script.sql | mysql bla bla bla)
    ==> le bug disparait en test

    2. le comportement attendu serait que ca continue de bugguer vu que les procédures stockées étaient les memes avant et après leur écrasement...

    j'y comprends rien

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/10/2010, 14h16
  2. problème requete "Incorrect string value"
    Par darontankian dans le forum Débuter
    Réponses: 11
    Dernier message: 09/12/2009, 09h58
  3. [MySQL] Comprendre - Incorrect integer value: '' for column at row 1
    Par francois_a dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/09/2009, 04h04
  4. [MySQL] [php mysql et accent] : Incorrect string value '\xE0 cot\xE9.'
    Par eth85 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/02/2009, 23h24
  5. [mysql5]problème truncated incorrect double value xx
    Par moulefrite dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 10/11/2006, 17h17

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