Ankündigung

Einklappen
Keine Ankündigung bisher.

PDO MariaDB json_set mit cast json

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PDO MariaDB json_set mit cast json

    Hallo Zusammen

    Wenn ich folgendes Update Statement ausführe,
    PHP-Code:
    $statement $pdo->prepare('UPDATE `cats` SET `data` = json_set(`data`, \'$."foo"\', cast(? as json)) WHERE `id` = ?');
    $statement->execute([
        [
    'foo'],
        
    3,
    ]); 

    bekomme ich diesen Fehler:
    Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'json)) WHERE `id` = ?'
    Ich benutze die Version 10.4.18-MariaDB. Ich finde nirgends was im Netz, wieso das nicht geht. Habe das selbe mit dem Laravel QueryBuilder versucht, da kommt die gleiche Meldung.
    Weiss den da ein Profi Rat? Vielen Dank im voraus.

  • #2
    Also dieser Code funktioniert bei mir ohne Probleme:

    Code:
    drop table if exists `t1`;
    CREATE TABLE t1 (id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, data JSON);
    
    INSERT INTO t1 (data) VALUES('{}');  
    UPDATE t1 SET data = JSON_SET(data, '$.foo', cast('["foo"]' as json)) WHERE id = 1;
    
    SELECT * FROM t1;
    Ich denke dein Fehler könnte ggf. am Escaping / Übergabe des JSON liegen:

    PHP-Code:
    $statement $pdo->prepare('UPDATE `cats` SET `data` = json_set(`data`, \'$.foo\', cast(? as json)) WHERE `id` = ?');
    $statement->execute([
        
    json_encode(['foo']), // <-- Hier
        
    3,
    ]); 

    Kommentar


    • #3
      Bei mir geht auch dein SQL Befehl nicht wenn ich den direkt in phpMyAdmin ausführe.
      Komisch, ich weiss nicht warum? An was könnte es denn noch liegen?

      Ich habe folgende SQL Befehle ausprobiert:

      Syntax error:
      Code:
      UPDATE cats SET data = cast('["foo"]' as json) WHERE id = 1;
      Klappt
      Code:
      UPDATE cats SET data = CAST("2018-11-30" AS DATE) WHERE id = 1;
      Sieht so aus, als wäre das casting zu json das Problem

      Kommentar


      • #4
        Ich glaube, wenn ich es recht verstehe unterstützt es das nicht:

        https://mariadb.com/kb/en/json-data-type/

        und hier letzter Kommentar
        https://mariadb.com/kb/en/cast/

        When will JSON be included as cast type?

        Kommentar


        • #5
          Zitat von strub Beitrag anzeigen
          Bei mir geht auch dein SQL Befehl nicht wenn ich den direkt in phpMyAdmin ausführe.
          Komisch, ich weiss nicht warum? An was könnte es denn noch liegen?

          Ich habe folgende SQL Befehle ausprobiert:

          Syntax error:
          Code:
          UPDATE cats SET data = cast('["foo"]' as json) WHERE id = 1;
          Klappt
          Code:
          UPDATE cats SET data = CAST("2018-11-30" AS DATE) WHERE id = 1;
          Sieht so aus, als wäre das casting zu json das Problem
          Falsche Datenbank?

          Code:
          postgres=# select cast('["foo"]' as json);
            json   
          ---------
           ["foo"]
          (1 row)
          Du könntest auch nach JSONB casten:

          Code:
          postgres=# select cast('["foo"]' as jsonb);
            jsonb  
          ---------
           ["foo"]
          (1 row)
          Im Unterschied zu JSON wird JSONB intern in binärer Form gespeichert und die Objekte drin sind indizierbar.
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            Nachtrag: da stellt sich auch die Frage nach dem Datentyp Deiner Spalte... in #3 castest Du das in unterschiedliche Datentypen, eine Spalte kann aber nur einen haben.
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Zitat von strub Beitrag anzeigen
              Ich glaube, wenn ich es recht verstehe unterstützt es das nicht:

              https://mariadb.com/kb/en/json-data-type/

              und hier letzter Kommentar
              https://mariadb.com/kb/en/cast/
              Ich denke auch das wird es sein. Ich hatte es mit dem original mysql getestet und nicht mit MariaDB. In deinem ersten link steht auch das MariaDB, anders wie MySQL, longtext für json columns nutzt.

              Kommentar


              • #8
                @akretschmer
                Möchte aber MariaDB benutzen.

                da stellt sich auch die Frage nach dem Datentyp Deiner Spalte... in #3 castest Du das in unterschiedliche Datentypen, eine Spalte kann aber nur einen haben.
                War nur als test

                Zeichen32

                Jas wird es wohl sein .

                Kommentar


                • #9
                  Zitat von strub Beitrag anzeigen
                  @akretschmer
                  [B]Möchte aber MariaDB benutzen.
                  Cool! Viel Spaß damit!.
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar

                  Lädt...
                  X