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 036
    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 036
    Points : 9 441
    Points
    9 441

    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

Discussions similaires

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

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