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 :

Comparer deux strings (url) dans un trigger


Sujet :

SQL Procédural MySQL

  1. #1
    Membre à l'essai Avatar de Sinbad93
    Homme Profil pro
    Apprenti Dev
    Inscrit en
    Octobre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti Dev

    Informations forums :
    Inscription : Octobre 2020
    Messages : 23
    Points : 20
    Points
    20
    Par défaut Comparer deux strings (url) dans un trigger
    Bonjour,
    J'ai un trigger qui compare OLD.value and NEW.value sur mes updates pour pouvoir insérer dans un historique quand il y a une modification.
    Cela fonctionne parfaitement sur toutes mes données (string ou int).
    Mais pourtant cela ne fonctionne pas sur la comparaison de deux strings url (exemple du format du string : 'http://localhost:3000/images/my-image_(3).png1642412962617.png')
    Il semblerait que mon trigger soit incapable de comparer deux strings comme ceux là car quand je change la valeur de la colonne il ne se passe rien.
    Voila le type de comparaison que j'ai essayé (image étant la colonne contenant le string):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IF (NEW.image != OLD.image) THEN
    IF (NEW.image NOT LIKE OLD.image) THEN
    J'ai également tenté de comparé la valeur HEX ou de les passer en SUBSTR après les '/', mais rien n'y fait.
    en sachant je le rappel que cela fonctionne pour toutes mes autres types de données.

    J'en déduis donc que pour une raison qui m'échappe MySQL ne peux pas comparer deux string au format URL,
    Quelqu'un saurait pourquoi & si je peux trouver une façon de comparer mes deux urls d'image ?

    Merci de votre attention,
    Sinbood

  2. #2
    Membre à l'essai Avatar de Sinbad93
    Homme Profil pro
    Apprenti Dev
    Inscrit en
    Octobre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti Dev

    Informations forums :
    Inscription : Octobre 2020
    Messages : 23
    Points : 20
    Points
    20
    Par défaut détails supplémentaires
    Ce qui est curieux c'est que si je fais une requête MySQL je n'ai aucun soucis à comparer l'url en question pour trouver les lignes associés...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * FROM items WHERE image LIKE 'http://localhost:3000/images/rub.jpg1634736296216.jpg';
    SELECT * FROM items WHERE image = 'http://localhost:3000/images/rub.jpg1634736296216.jpg';
    SELECT * FROM items WHERE image NOT LIKE 'http://localhost:3000/images/rub.jpg1634736296216.jpg';
    SELECT * FROM items WHERE image != 'http://localhost:3000/images/rub.jpg1634736296216.jpg';
    Toutes ces requêtes fonctionnent parfaitement.
    Je précise que la colonne est un simple VARCHAR(255).
    Mais sur un TRIGGER, il ne semble pas capable de comparer deux urls sous le même format
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    IF (NEW.image != OLD.image) THEN
    INSERT INTO history SET data = 'image', 
    id = NEW.id,
    ref = NEW.ref,
    status_ = 'modified'
    END IF;
    Ceci ne retourne rien sur mon TRIGGER (before update) comme si pas détecté.
    Pourtant même type de condition pour mes autres données et cela rentre bien dans l'historique.
    Quelqu'un sait de quoi il s'agit ?

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    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 378
    Points : 19 055
    Points
    19 055
    Par défaut
    Salut Sinbad9.

    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
    --------------
    START TRANSACTION
    --------------
     
    --------------
    set session collation_connection = "latin1_general_ci"
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_cs`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    (  `id`    integer unsigned NOT NULL auto_increment primary key,
       `modif`    char(003)         NULL,
       `url`   varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_cs`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`id`,`modif`,`url`) values
      (25, NULL, 'http://localhost:3000/images/rub.jpg1634736296216.jpg'),
      (34, NULL, 'http://localhost:3000/images/rub.jpg1234567890123.jpg')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+-------+-------------------------------------------------------+
    | id | modif | url                                                   |
    +----+-------+-------------------------------------------------------+
    | 25 | NULL  | http://localhost:3000/images/rub.jpg1634736296216.jpg |
    | 34 | NULL  | http://localhost:3000/images/rub.jpg1234567890123.jpg |
    +----+-------+-------------------------------------------------------+
    --------------
    DROP TABLE IF EXISTS `hist`
    --------------
     
    --------------
    CREATE TABLE `hist`
    (  `id`      integer unsigned NOT NULL auto_increment primary key,
       `clef_id` integer unsigned NOT NULL,
       `url`     varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_cs`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    select * from `hist`
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `verify`
    --------------
     
    --------------
    CREATE TRIGGER `verify`
    BEFORE UPDATE ON `test`
    FOR EACH ROW
    BEGIN
            if (NEW.url = OLD.url) THEN
                    SET NEW.modif = 'Non';
            ELSE
                    SET NEW.modif = 'Oui';
                    insert into `hist` (`clef_id`,`url`) value (OLD.id,OLD.url);
            END IF;
    END
    --------------
     
    --------------
    update `test` set url='http://localhost:3000/images/rub.jpg1634736296216.jpg' where id=25
    --------------
     
    --------------
    update `test` set url='http://localhost:3000/images/rub.jpg1634736296216.jpg' where id=34
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+-------+-------------------------------------------------------+
    | id | modif | url                                                   |
    +----+-------+-------------------------------------------------------+
    | 25 | Non   | http://localhost:3000/images/rub.jpg1634736296216.jpg |
    | 34 | Oui   | http://localhost:3000/images/rub.jpg1634736296216.jpg |
    +----+-------+-------------------------------------------------------+
    --------------
    select * from `hist`
    --------------
     
    +----+---------+-------------------------------------------------------+
    | id | clef_id | url                                                   |
    +----+---------+-------------------------------------------------------+
    |  1 |      34 | http://localhost:3000/images/rub.jpg1234567890123.jpg |
    +----+---------+-------------------------------------------------------+
    --------------
    COMMIT
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Cordialement.
    Artemus24.
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Membre à l'essai Avatar de Sinbad93
    Homme Profil pro
    Apprenti Dev
    Inscrit en
    Octobre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti Dev

    Informations forums :
    Inscription : Octobre 2020
    Messages : 23
    Points : 20
    Points
    20
    Par défaut Résolu
    Merci Artemus24,
    Tu gères ! c'était instructif
    J'ai réussi à résoudre mon problème grâce à toi en prenant les choses à l'envers et en testant l'égalité en premier lieu et en renvoyant vers 'ELSE' l'inégalité.
    Je ne saisi pas vraiment pourquoi dans le sens inverse je n'ai pas obtenu l'effet escompté, mais la finalité est là
    Bien à toi,
    Sinbad93

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    @Sinbad93 :

    utiliser l'opérateur LIKE ainsi
    SELECT * FROM items WHERE image LIKE 'http://localhost:3000/images/rub.jpg1634736296216.jpg';.
    Ne présente aucun intérêt : faute de "wildcard" "_" ou "%", ce test est identique à un test d'égalité.

    Attention aussi à penser à comparer des chaînes de caractères de mêmes collations. On peut forcer la collation dans la requête avec la clause COLLATE

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

Discussions similaires

  1. Comparer deux strings.
    Par jamsgoodon dans le forum Débuter
    Réponses: 4
    Dernier message: 23/03/2011, 09h59
  2. comparer deux string
    Par dingua dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 06/12/2009, 13h29
  3. comparer deux chaines contenues dans les cellules de deux tableaux
    Par ellewided dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 22/07/2009, 11h03
  4. [Débutant] Comparer deux strings
    Par madaou dans le forum Pascal
    Réponses: 6
    Dernier message: 25/12/2008, 21h06
  5. comparer deux string
    Par jul54 dans le forum MFC
    Réponses: 3
    Dernier message: 22/04/2004, 15h50

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