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

SQL Procédural MySQL Discussion :

Bug cast text/int


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de benjamin122
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Par défaut Bug cast text/int
    Bonjour,

    Au sein d'un trigger, j'effectue un cast d'un text vers un integer. Mon problème est que quand j'effectue la requête manuellement, le casting passe très bien.
    Mon last data est un varchar(50) et contient : "253487";

    Ce code fonctionne à merveille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT text from product_attribute where attribute_id = CAST(last_data AS UNSIGNED ) and product_id =1 ;
    Celui-ci(qui est à l'intérieur d'un trigger) ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT text as a into vattr_name from product_attribute where attribute_id = CAST(last_data AS UNSIGNED) and product_id = new.product_id ;
    et voici dans le log mysql, ce que ça dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    3372 Query	SELECT texte as a into vattr_name from product_attribute where attribute_id = CAST( NAME_CONST('last_data',_ u c s 2'\02\05\03\04\08\07'   C O L L A T E   ' u c s 2 _ g e n e r a l _ c i') AS UNSIGNED) and product_id = new.product_id
    et ça donne une série de null, si je vous montre via un printscreen

    Nom : erreur.jpg
Affichages : 108
Taille : 26,9 Ko

    Comment se fait-il que manuellement ça fonctionne, et que dans le log l'erreur est bien là, le cast ne passe pas et plante?
    Problème d'encodage? j'ai essayé tout ce qui me passait par la tête mais rien n'y fait

    Milles remerciements à quiconque peut me donner une piste pour trouver ce problème

    benjamin122

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 6 882
    Par défaut
    Salut benjamin122.

    Pour résoudre ton problème, il me faudrait le descriptif de ta table 'product_attribute'.
    Ensuite me donner un jeu d'essai avec le résultat que tu désires obtenir.
    Et en français, ce que tu désires faire comme traitement.

    D'une part, je ne suis pas devin, et il met difficile de connaitre le contenu de ta table et d'autre part, ce n'est pas avec le peu d'information que tu nous donnes, que je vais résoudre quoi que ce soit

    @+

  3. #3
    Membre averti Avatar de benjamin122
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Par défaut
    Bonjour Artemus24,

    j'ai pu régler le problème. En mysql , pas besoin de casting , apparemment cela se fait tout seul.
    Car
    donne comme résultat 2.

    Donc le problème est réglé et je n'ai plus ces données dans le log. Cependant, j'aimerai tout de même savoir pourquoi quand le casting est spécifié(même si on en a pas besoin), dans la console par exemple,
    la requête s'effectue avec succès, mais pas dans un trigger

    De plus, dans le log mysql, j'aimerai bien savoir pourquoi d'ou sort ceci (sachant que je n'ai jamais spécifié cela dans le trigger):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    3372 Query	SELECT texte as a into vattr_name from product_attribute where attribute_id = CAST( NAME_CONST('last_data',_ u c s 2'\02\05\03\04\08\07'   C O L L A T E   ' u c s 2 _ g e n e r a l _ c i') AS UNSIGNED) and product_id = new.product_id
    NAME_CONST?
    UCS2 collate
    ucse_gereal_ci

    y-a t-il un rapport avec l'encodage et/ou des variables récupérées automatiquement?

    Vu que j'ai trouvé la solution au problème, le sujet est résolus. c'est juste que je suis de nature curieux
    Si vous désirez éclaircir mes incompréhensions, je peux poster plus d'informations concernant mes tables mais je ne sais pas si cela est toujours necessaire.


    Des remerciements sont insignifiant pour vous montrer ma gratitude que j'ai à votre égard.
    Sincères remerciements

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 6 882
    Par défaut
    Salut benjamin122.

    Je n'ai pas tout compris de ce que vous essayez de faire. J'espère que mon test va correspondre à ce que vous attendez.

    Citation Envoyé par benjamin122
    Au sein d'un trigger, j'effectue un cast d'un text vers un integer.
    Ce qui me parait très étrange, c'est pourquoi avez-vous un nombre dans une chaîne de caractères ?
    Si c'est au chargement de votre table que le problème se pose, faites en sorte de charger votre nombre dans le bon type.

    Si vous avez besoin d'exploiter ce nombre, créez une colonne au type 'integer' et remplissez la.
    Ainsi vous n'aurez pas besoin de le convertir ou de faire quoi que ce soit d'autre sur cette colonne.

    Citation Envoyé par benjamin122
    Cependant, j'aimerai tout de même savoir pourquoi quand le casting est spécifié (même si on en a pas besoin), dans la console par exemple, la requête s'effectue avec succès, mais pas dans un trigger ?
    La syntaxe n'est pas correcte. Le nom de la colonne de la table qui est associée au trigger, se nomme : 'new.col'.

    J'ai créé deux tables : 'test' et 'sample'.
    Dans la première partie, j'ai créé une nouvelle colonne 'val'. Et je l'initialise avec la valeur de la colonne 'ch' qui est de type 'text'.
    Je fais le test de l'égalité : "select * from `test` where ch = val", entre la chaîne de caractère et la colonne numérique. Et cela fonctionne sans cast.

    Dans la seconde partie, j'utilise un trigger sur la table 'sample'. Je fais le même test que chez vous, mais avec la bonne syntaxe. Résultat : cela fonctionne.
    Dans le vidage de la table 'sample', j'ai le contenu de la colonne 'id' de la table 'test' dans la colonne 'ptr', si j'ai l'égalité.
    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
    136
    137
    138
    139
    140
    141
    --------------
    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,
      `ch`   char(20)         NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`ch`) VALUES
    ('25'), ('72'), ('255'), ('65535')
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+-------+
    | id | ch    |
    +----+-------+
    |  1 | 25    |
    |  2 | 72    |
    |  3 | 255   |
    |  4 | 65535 |
    +----+-------+
    --------------
    alter table `test` add val integer unsigned not null
    --------------
     
    --------------
    update `test` set val = ch
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+-------+-------+
    | id | ch    | val   |
    +----+-------+-------+
    |  1 | 25    |    25 |
    |  2 | 72    |    72 |
    |  3 | 255   |   255 |
    |  4 | 65535 | 65535 |
    +----+-------+-------+
    --------------
    select * from `test` where ch = val
    --------------
     
    +----+-------+-------+
    | id | ch    | val   |
    +----+-------+-------+
    |  1 | 25    |    25 |
    |  2 | 72    |    72 |
    |  3 | 255   |   255 |
    |  4 | 65535 | 65535 |
    +----+-------+-------+
    --------------
    DROP TABLE IF EXISTS `sample`
    --------------
     
    --------------
    CREATE TABLE `sample`
    (
      `id`   integer unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `ch2`  char(20)         NOT NULL,
      `ptr`  integer              NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `verif`
    --------------
     
    --------------
    CREATE TRIGGER `verif`
    BEFORE INSERT ON `sample`
    FOR EACH ROW
    BEGIN
            DECLARE _id INTEGER DEFAULT 0;
     
            SELECT id INTO _ID FROM `test` where val = CAST(new.ch2 AS UNSIGNED);
     
            SET new.ptr = _id;
     
    END
    --------------
     
    --------------
    INSERT INTO `sample` (`ch2`, `ptr`) VALUES
    ('33', NULL), ('77', NULL), ('25', NULL), ('44', NULL)
    --------------
     
    --------------
    select * from sample
    --------------
     
    +----+-----+------+
    | id | ch2 | ptr  |
    +----+-----+------+
    |  1 | 33  |    0 |
    |  2 | 77  |    0 |
    |  3 | 25  |    1 |
    |  4 | 44  |    0 |
    +----+-----+------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    J'ai fait aussi le test sans le cast, cela fonctionne aussi.
    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
    DROP TRIGGER IF EXISTS `verif`
    --------------
     
    --------------
    CREATE TRIGGER `verif`
    BEFORE INSERT ON `sample`
    FOR EACH ROW
    BEGIN
            DECLARE _id INTEGER DEFAULT 0;
     
            SELECT id INTO _ID FROM `test` where val = new.ch2;
     
            SET new.ptr = _id;
     
    END
    --------------
     
    --------------
    INSERT INTO `sample` (`ch2`, `ptr`) VALUES
    ('33', NULL), ('77', NULL), ('25', NULL), ('44', NULL)
    --------------
     
    --------------
    select * from sample
    --------------
     
    +----+-----+------+
    | id | ch2 | ptr  |
    +----+-----+------+
    |  1 | 33  |    0 |
    |  2 | 77  |    0 |
    |  3 | 25  |    1 |
    |  4 | 44  |    0 |
    +----+-----+------+
    --------------
    Donc le cast ne sert à rien.

    Citation Envoyé par benjamin122.
    et ça donne une série de null, si je vous montre via un printscreen
    Votre serveur mysql est certainement différent de mon serveur car je n'obtiens pas du tout le même résultat que vous.

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/08/2008, 12h17
  2. Bug IE7 texte en gras
    Par defacta dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 13/12/2007, 23h34
  3. cast Integer / int
    Par zaineb.z dans le forum Langage
    Réponses: 8
    Dernier message: 18/07/2007, 15h28
  4. [débutant] cast string->int
    Par gigigao dans le forum Visual C++
    Réponses: 8
    Dernier message: 23/08/2006, 11h47
  5. [Language]Cast de int en Object ?
    Par BouB dans le forum Langage
    Réponses: 5
    Dernier message: 22/12/2005, 17h41

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