Jörg: mysql und Regex

Hallo,

ich habe eine Query mit Regex, die ein Image austauschen soll. Laufen soll das auf einem 10.4.17-Maria-DB-Server, der das können sollte.

Den Ausdruck selber matcht https://regex101.com/, der sollte also passen.

Trotzdem wird die Query nicht ausgeführt, sie produziert aber auch keinen Fehler.

Habe ich vielleicht die Funktion REGEXP_REPLACE missverstanden?

UPDATE
table1
SET
spalte = REGEXP_REPLACE(spalte, '/\[img\](.*?)xyz_zyx_abc(.*?)\[\/img\]/', '[img]http://localhost/test123/xyz_zyx_abc/bilder-1.jpg[/img]')
WHERE del = 0

Was macht man in so einem Fall?

Jörg

  1. Hallo Jörg,

    ich habe gerade keine Zeit für eine ausführliche Betrachtung - der Garten ruft "pfleg mich, Rolf, pfleg mich!". Und die Sonne lacht mich dabei aus. Naja, besser, als wenn die Wolken mich sehen und darüber weinen...

    Du solltest aber auf jeden Fall die Doku zur Regex-Syntax von MySql zu Rate ziehen, und dich vorher fragen: Ist es MySql? Oder vielleicht MariaDB? Und dementsprechend die richtige Doku heranziehen.

    Ich bin nämlich überhaupt nicht sicher, ob MySQL/Maria - so wie PHP - die PCRE-Syntax verwenden. Regex-Implementierungen sind zwar konzeptionell ähnlich, es gibt aber keine Norm. Deswegen muss man immer gucken, in welcher Umgebung sie ausgeführt werden.

    Rolf

    --
    sumpsi - posui - obstruxi
  2. Hi,

    Den Ausdruck selber matcht https://regex101.com/, der sollte also passen.

    Da kann man, soweit ich sehe, keine "MySQL"-Variante auswählen.

    Soweit ich weiß, sind die Regex-Engines der diversen Datenbanken (MySQL, postGres, Oracle) eher schwach aufgestellt, was die implementierten Features angeht.

    MySQL unterstützt z.B: kein *? oder +? wenn ich das richtig sehe.

    https://dev.mysql.com/doc/refman/8.0/en/regexp.html#regexp-syntax

    cu,
    Andreas a/k/a MudGuard

    1. Hallo Andreas,

      sei vorsichtig mit der MySQL 8 Doku - das Ding kann zwar viel mehr, aber ich mutmaße, dass kein Hoster das anbietet. Zuviel Larry drin.

      Weswegen sich Maria ja auch von Josef Flipper getrennt hat und selbstständig durch die Gegend robbt. Und die Hoster robben ihr hinterher, soweit ich weiß...

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Hallo Rolf und hallo Andreas,

        Ok, nutzt eh nichts. Mein Produktivserver kennt die Funktion REGEXP_REPLACE gar nicht mal.

        Schade, aber was bleibt mir jetzt?

        Über einen SELECT auslesen, php matchen lassen und dann wieder updaten? 😕

        Oder gibts sonst eine Idee, wenn ich schon rexexen muss?

        Bei bekannten Dingen könnte man ja REPLACE nutzen, aber bei unbekannten Sachen?

        Gruß und frpohes Werkeln im sonnigen Garten,

        Jörg

        1. Hallo Jörg,

          Über einen SELECT auslesen, php matchen lassen und dann wieder updaten?

          Prinzipiell ja.

          In SQL Systemen wie DB2 oder MS SQL würde ich einen Update-Cursor verwenden, aber das gibt's in MySQL dem Anschein nach nicht. Oder doch? Was genau verwendest Du?

          Wieviele Sätze liefert der Select? Ist das klein genug, um es im RAM zu halten?

          Rolf

          --
          sumpsi - posui - obstruxi
          1. Hallo Rolf,

            In SQL Systemen wie DB2 oder MS SQL würde ich einen Update-Cursor verwenden, aber das gibt's in MySQL dem Anschein nach nicht. Oder doch? Was genau verwendest Du?

            Sowohl maria-db als auch mysql.

            Wieviele Sätze liefert der Select? Ist das klein genug, um es im RAM zu halten?

            Ja, ich glaube, da muss ich keine Gedanken machen. Es werden vermnutlich nie mehr als 20-30 Datensätze sein.

            Gruß, Jörg

  3. Hallo,

    das Muster sieht so aus, als würde das mit LIKE und Jokern gehen.

    LG
    Ralf