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 :

Supprimer une chaîne de caractère d'une colonne


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Supprimer une chaîne de caractère d'une colonne
    Bonjour à tous !

    Je me permets de faire appel à vos lumières car je n'arrive pas à trouver la solution à mon problème, et ça fait plusieurs heures que je cherche.
    Je vous explique : j'ai des colonnes de type texte dans une table, et dans ces colonnes, je veux supprimer une chaîne de caractères récurrente.
    Ce n'est pas toujours la même chaîne de caractères, mais elle fait toujours 8 caractères de long.
    Pour être plus précis, il s'agit d'une base de données d'un forum que je viens de migrer de IPB vers phpBB. Chaque fois que j'avais une balise BBCode, je me retouve suffixé avec des espèces de chiffres bizarres.

    Exemple :
    [ quote] devient [ quote:2l1apa1c]
    [/ quote] devient [/ quote:2l1apa1c]

    Avec un "2l1apa1c" constant au sein d'un message, mais différent d'un message à l'autre.

    Je voudrais donc virer toute cette chaîne de caractères : ":2l1apa1c"

    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    update `phpbb_privmsgs`
    set `message_text` = replace(`message_text`, ':________]', ']')
    Mais ça ne marche pas (il ne trouve aucun enregistrement).

    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    update `phpbb_privmsgs`
    set `message_text` = replace(`message_text`, ':%]', ']')
    Mais ça ne marche toujours pas (aucun enregistrement trouvé non plus).

    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    update `phpbb_privmsgs`
    set `message_text` = replace(`message_text`, ':'%']', ']')
    Mais là, mon message devient carrément tout vide !

    Avez-vous une idée ?

    D'avance merci !

    Alex.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 70
    Points : 77
    Points
    77
    Par défaut
    Salut theghit,

    As tu essayé ceci pour repérer tes enregistrements posant pb:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT message_text, ...autres champs si tu veux
    FROM phpbb_privmsgs
    WHERE message_text LIKE ':%]'
    Si ceci ne te retournes que des enregistrements posant problème, tu peux essayé ton update de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE phpbb_privmsgs
    SET message_text = CONCAT_WS ('', LEFT(message_text, LOCATE(':',message_text)-1),']')
    WHERE message_text LIKE ':%]'
    Enfin un truc dans le genre, tout dépend si ta chaine de caractère s'ajoute toujours au même endroit, si c'est le cas, ce genre de manipulation peut t'aider à résoudre ton pb. Avant de faire un update, test le résultat en faisant un select, deux précautions valent mieux qu'une .

    @+

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour ta réponse !

    Alors, en premier lieu, la requête qui me renvoie mes enregistrements fautifs est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT message_text, ...autres champs si tu veux
    FROM phpbb_privmsgs
    WHERE message_text LIKE '%:%]%'
    Parce qu'il y a du texte avant mon ':12345678]' et du texte après.

    Ensuite, ta seconde requête marche au poil... sauf que je ne me retrouve plus qu'avec un [ quote] dans tout mon message
    En fait mon souci c'est que je peux avoir plusieurs :12345678], du texte entre les deux, et aussi des ':' dans mon texte. Bref, c'est la cata.

    N'y a-t-il pas une commande magique qui permet de remplacer une chaîne de caractères ?
    Par exemple, cette requête me renvoie bien mes enregistrements à problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from `phpbb_privmsgs`
    where `message_text` like '%:________]%'
    Mais celle-ci ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    update `phpbb_privmsgs`
    set `message_text` = replace(`message_text`, ':________]', ']')


    Edit : avec un exemple de ce que j'ai dans mes messages, ce sera peut-être plus causant :

    [quote:2l1apa1c][quote:2l1apa1c][quote:2l1apa1c]j'rigole pour l'Iphone

    C'est une belle machine. :jap: [/quote:2l1apa1c]

    Une belle machine pour un geek comme moi, ouais !
    [/quote:2l1apa1c]

    Je n'osais le dire. :rougi: [/quote:2l1apa1c]

    Pourquoi ? C'est ma nature, il faut bien l'accepter

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 70
    Points : 77
    Points
    77
    Par défaut
    En effet, c'est nettement plus compliqué comme ceci. Concernant la fonction REPLACE, celle-ci fait une comparaison de chaines de caractères, as tu essayé d'inclure un caractère d'échappement (\) avant chaque _ ? Peut être que MySQL considère _ comme un caractère pour cette fonction et non pas comme un caractère générique.

    Si cela ne fonctionne pas, je n'ai malheureusement pas de solution dans l'immédiat, désolé .

    @+

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Non, ça ne marche pas mieux. Merci d'avoir cherché en tous cas. En même temps, si la solution n'est pas simple, ça me rassure un peu de ne pas l'avoir trouvée

  6. #6
    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 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

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

    Ce sont toujours 8 caractères placés en fin de balise ? Toujours juste avant le crochet fermant "]" ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Bonjour !

    Oui, c'est exactement ça, c'est toujours 8 caractères coincés entre un ':' et un ']'. Voici un autre exemple :

    Dans la grande famille des jeux dits d'infiltration, on retrouve 2 sagas. Une première, très réaliste, [b:19nlrirb][i:19nlrirb]Splinter Cell[/i:19nlrirb][/b:19nlrirb], basée sur l'univers particulier de Tom Clancy. Sam Fisher évolue dans des niveaux tous assez semblables, l'approche est réaliste.
    Puis il y a aussi la saga [i:19nlrirb][b:19nlrirb]Metal Gear[/b:19nlrirb][/i:19nlrirb]. On pourra rajouter les géniaux [i:19nlrirb][b:19nlrirb]Thief[/b:19nlrirb][/i:19nlrirb], [i:19nlrirb][b:19nlrirb]Tenchu[/b:19nlrirb][/i:19nlrirb] (saga qui se pourrifie violemment avec le temps) et [i:19nlrirb][b:19nlrirb]Deus Ex[/b:19nlrirb][/i:19nlrirb], maître étalon dans son domaine.
    C'est pour ça que j'ai essayé de faire mon "replace" avec 8 "_"

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 70
    Points : 77
    Points
    77
    Par défaut
    Salut theghit,

    De retour après une nuit de sommeil, cela fait du bien. As tu avancé sur ton problème ? Peut être que tu peux résoudre celui-ci en ne passant pas par du SQL, tout dépend de la manière dont ta table est créée, et surtout la taille.

    Si celle-ci ne contient pas de blob, et qu'elle n'est pas trop volumineuse, tu peux l'exporter à l'aide de la commande 'SELECT .... INTO OUTFILE ...', modifier les données à l'aide d'un éditeur de texte en utilisant la fonction remplacer (je te conseille PSPAD gratuit et très complet), puis réintégrer les données à l'aide de la commande 'LOAD DATA INFILE...'.

    Attention, la commande 'LOAD DATA INFILE...' ne fait pas d'update, que de l'insertion.

    En espérant que cela t'aide à résoudre ton pb.

    A bientôt.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Bon, après plusieurs heures de recherche intensive, j'ai fait marcher une requête :

    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
    UPDATE `phpbb_privmsgs`
    SET `message_text` =
    CONCAT(
    	SUBSTR(
    		`message_text`,
    		1,
    		LOCATE(']', `message_text`) - 10
    		),
    	']',
    	SUBSTR(
    		`message_text`,
    		LOCATE(']', `message_text`) + 1,
    		LENGTH(`message_text`) - LOCATE(']', `message_text`) + 10
    		)
    	)
    WHERE `message_text` LIKE '%:________]%'
    Problème : ça ne marche que pour ma première balise vérolée, toutes les autres restent en l'état.

    Quant à ta solution, dnode57, c'est peut-être la seule qui me restera, mais je ne vois pas comment je peux faire un rechercher/remplacer avec une chaîne de caractères qui change à chaque nouveau post ? En plus, mes tables sont assez grosses, et j'ai peur de perdre des infos en descendant puis remontant tout ça (et d'ailleurs dans ma table en question, la zone est un Blob).
    Bref, j'aimerais trouver une solution SQL, mais j'ai l'impression que c'est impossible

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 70
    Points : 77
    Points
    77
    Par défaut
    Le problème vois tu c'est que la taille de ton texte, ainsi que le nombre de balises sont variables. Par conséquent, tu ne peux pas utiliser de requêtes se basant sur des valeurs numériques fixes.

    Si quelqu'un a une solution SQL à ton problème, je m'empresse de la sauvegarder.

    Dans ton premier post tu a bien précisé que ce phénomène est apparu après avoir migré une base. Maintenant que la migration est terminée, les caractères s'ajoutent toujours à tes balises? Si ce n'est pas le cas, aurais tu loupé quelque chose au moment de la migration, un paramètre permettant d'éviter ce genre de pb ?

    Au pire, essaye la solution de remplacement de texte sur un échantillon tu verras bien ce qui se passe.

    @+

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    En fait, la taille de mon texte est variable, certes, mais pas celui qui s'ajoute à la fin de mes balises.

    Par exemple, je vais avoir des parasites comme ça :

    [quote:2l1apa1c]
    [i:19nlrirb]
    [url=http://medium_trailer.html:20os02q8]
    Ce qui il y a entre le ':' et le ']' fait toujours 8 caractères.
    C'est trop bête que le joker "_" ne marche pas dans la fonction replace, car ça aurait tout résolu !

    Maintenant, tu as raison, quelque chose a clairement foiré lors de la migration, et je vais peut-être devoir repartir de là. Depuis, ça ne le fait plus, c'est juste mon export ou mon import qui a posé problème...

    Sinon, pour le remplacement de texte, j'ai le même problème avec un éditeur de texte normal, comment est-ce que je peux lui dire de me supprimer ces caractères parasites ?

  12. #12
    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 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    A mon humble avis, il n'y a pas de solution simple en SQL, justement parce que dans un même champ, tu vas avoir plusieurs balises à corriger (et que ce nombre est variable).

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 70
    Points : 77
    Points
    77
    Par défaut
    Quel éditeur de texte utilises tu ? Sur un des messages précédents je t'avais mis un lien pour télécharger PSPAD. Sa fonction de remplacement permet de faire une recherche en incluant des caractères génériques. Ci-joint une capture d'écran.

    Bonne chance, et à bientôt.
    Images attachées Images attachées  

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Bon, et bien merci d'avoir cherché avec moi.
    J'ai donc abandonné la méthode SQL.
    J'ai tout rapatrié en local, ce qui m'a fait un beau petit fichier texte de 40 Mo.
    Je l'ai passé dans une moulinette Access pour le transformer en requête d'update, puis en fichier texte pour remplacer tous les caractères qui ne me plaisaient pas, puis je l'ai découpé en 40 morceaux parce que sinon c'était trop gros.
    Problème : j'utilise phpMyAdmin, et quand je passais par "import", ça me tronquait chacun de mes enregistrements, bizarre...
    Finalement, en collant mes requêtes dans le requêteur directement, ça passait bien.
    J'y ai donc passé du temps, mais à priori, j'ai récupéré mes enregistrements correctement.
    Merci encore pour votre aide.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/08/2012, 19h08
  2. supprimer les caractères \" d'une chaîne de caractères
    Par laurentSc dans le forum Langage
    Réponses: 23
    Dernier message: 17/09/2011, 23h52
  3. Réponses: 6
    Dernier message: 09/11/2010, 16h31
  4. Supprimer les N premiers caractères d'une chaîne
    Par kobalt02 dans le forum Débuter
    Réponses: 7
    Dernier message: 11/07/2008, 09h25
  5. Extraire une chaîne de caractères d'une chaîne
    Par dj-julio dans le forum Excel
    Réponses: 13
    Dernier message: 21/09/2007, 11h05

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