1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    novembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2011
    Messages : 26
    Points : 35
    Points
    35

    Par défaut Eviter warning suite à un alter table (passe de float en decimal(10,2) )

    Bonjour,

    Je dois modifier des tables contenant des montant. Ces derniers était en float. Suite à des problèmes de précision, je les ai passé en DECIMAL(10,2) avec une requete ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE `base`.`table` CHANGE COLUMN `montant` `montant` DECIMAL(10,2) NOT NULL
    Lors de l'application de la requete, j'ai le warning suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1433 row(s) affected, 64 warning(s): 1265 Data truncated for column 'montant' at row 3 1265 Data truncated for column 'montant'
    Les warning ont lieu lorsque le montant en float avait déjà une partie décimal.

    Or si je compare ma base de test à ma prod, les prix n'ont pas bougé d'un iota . Seule les prix type '16' '17.4' sont devenus des '16.00' ou '17.40' (ce qui fait partie du but de la manœuvre).

    Mais au vu ce la sensibilité des données (comptabilité), il m'a été demandé un moyen de contourner ces warning. Et là je sèche complètement...

    J'utilise la version 5.7 de MySQL.

    Merci par avance pour vos réponses.

  2. #2
    Expert éminent Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    3 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 3 192
    Points : 9 864
    Points
    9 864

    Par défaut

    Salut rorschach2.

    Citation Envoyé par rorschach2
    Mais au vu ce la sensibilité des données (comptabilité),
    Le type "float" ou "double" est réservé aux calculs scientifiques qui ne demande pas une grande précision.
    Pour des calculs, genre comptable, on utilise la précision maximale qui se traduit dans le type "decimal".

    Citation Envoyé par rorschach2
    il m'a été demandé un moyen de contourner ces warning. Et là je sèche complètement...
    C'est impossible de retrouver la précision comptable que vous demandez et ce, à cause de la représentation des nombres dans le type "float".
    Tout ce que vous pouvez faire, c'est utiliser un arrondi sur la troisième décimale, comme dans mon exemple. Le résultat sera approximatif mais c'est la meilleur solution.
    Si vous n'utilisez pas l'arrondi, la partie décimale sera tronquée à deux chiffres après la décimal, et donc le résultat sera aussi approximatif.
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`     INTEGER UNSIGNED  NOT NULL auto_increment PRIMARY KEY,
      `val`    float             NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`val`) VALUES
      (12.00),
      (13.65),
      (55.1234),
      (61.7654),
      (56.272)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+---------+
    | id | val     |
    +----+---------+
    |  1 |      12 |
    |  2 |   13.65 |
    |  3 | 55.1234 |
    |  4 | 61.7654 |
    |  5 |  56.272 |
    +----+---------+
    --------------
    alter table `test` add column `val2` decimal(15,2) NOT NULL
    --------------
     
    --------------
    describe `test`
    --------------
     
    +-------+------------------+------+-----+---------+----------------+
    | Field | Type             | Null | Key | Default | Extra          |
    +-------+------------------+------+-----+---------+----------------+
    | id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | val   | float            | NO   |     | NULL    |                |
    | val2  | decimal(15,2)    | NO   |     | NULL    |                |
    +-------+------------------+------+-----+---------+----------------+
    --------------
    update `test` set val2 = round(val,2)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+---------+-------+
    | id | val     | val2  |
    +----+---------+-------+
    |  1 |      12 | 12.00 |
    |  2 |   13.65 | 13.65 |
    |  3 | 55.1234 | 55.12 |
    |  4 | 61.7654 | 61.77 |
    |  5 |  56.272 | 56.27 |
    +----+---------+-------+
    --------------
    alter table `test` drop column `val`
    --------------
     
    --------------
    describe `test`
    --------------
     
    +-------+------------------+------+-----+---------+----------------+
    | Field | Type             | Null | Key | Default | Extra          |
    +-------+------------------+------+-----+---------+----------------+
    | id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | val2  | decimal(15,2)    | NO   |     | NULL    |                |
    +-------+------------------+------+-----+---------+----------------+
    --------------
    alter table `test` change column `val2` `val` decimal(15,2) NOT NULL
    --------------
     
    --------------
    describe `test`
    --------------
     
    +-------+------------------+------+-----+---------+----------------+
    | Field | Type             | Null | Key | Default | Extra          |
    +-------+------------------+------+-----+---------+----------------+
    | id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | val   | decimal(15,2)    | NO   |     | NULL    |                |
    +-------+------------------+------+-----+---------+----------------+
    --------------
    select * from `test`
    --------------
     
    +----+-------+
    | id | val   |
    +----+-------+
    |  1 | 12.00 |
    |  2 | 13.65 |
    |  3 | 55.12 |
    |  4 | 61.77 |
    |  5 | 56.27 |
    +----+-------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    avril 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2011
    Messages : 26
    Points : 20
    Points
    20

    Par défaut

    Salut,
    Primo, je me serais assuré que l'arrondi donne bien le bon résultat comptable attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT `montant`, ROUND(`montant`, 2) AS Montant2 FROM `base`.`table`
    Si cela est OK, juste transformer la requête SELECT en UPDATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE  `base`.`table` SET `montant` = ROUND(`montant`, 2);
    Puis changer le type de ton champ en décimal sans tenir compte de WARNING.
    @+

  4. #4
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    17 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 17 699
    Points : 41 282
    Points
    41 282
    Billets dans le blog
    1

    Par défaut

    ça n'est tout simplement pas possible de supprimer les warnings, parce que vous perdez de l'information en faisant cette transformation.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

Discussions similaires

  1. [ALTER table]warning sur longueur de ligne
    Par chrisisis dans le forum Sybase
    Réponses: 4
    Dernier message: 29/09/2010, 08h54
  2. Warning sur un Alter Table
    Par Poussy-Puce dans le forum Langage SQL
    Réponses: 8
    Dernier message: 18/01/2006, 17h45
  3. [Delphi 2] Alter Table
    Par Form_Load dans le forum Bases de données
    Réponses: 11
    Dernier message: 23/04/2004, 14h26
  4. Probleme 'ALTER TABLE' et 'FOREIGN KEY'
    Par maahta dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 30/09/2003, 14h25
  5. Alter table qui ne passe...
    Par Gential dans le forum MS SQL-Server
    Réponses: 4
    Dernier message: 04/06/2003, 17h48

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