mariadb 如何在MySQL REPLACE语句中处理JSON编码字符串

ql3eal8s  于 4个月前  发布在  Mysql
关注(0)|答案(1)|浏览(58)

我在一些MariaDB列中有这个字符串(让我们称之为MY_COL):{"libelle": "com\u00e9dien"},我想用{"libelle": "acteur"}替换它
使用这个STO post,我弄清楚了如何选择包含这个字符串的行:

SELECT MY_COL
FROM MY_TABLE
WHERE MY_COL LIKE '%{"libelle": "com\\\\u00e9dien%'

字符串
但是,当我在UPDATE语句中使用这种“超大转义”技术时,它不起作用

UPDATE MY_TABLE
SET MY_COL = REPLACE(MY_COL, '{"libelle": "com\\\\\\u00e9dien"', '{"libelle": "acteur"')


然而,我注意到这个SELECT语句工作得很好:

SELECT '{"libelle": "com\\\\\\u00e9dien"' As `Column_Before`,
REPLACE('{"libelle": "com\\\\\\u00e9dien"', '{"libelle": "com\\\\\\u00e9dien"', '{"libelle": "acteur"') As `Column_After`;


的数据
似乎是在REPLACE语句中引用Column_Name导致了这个问题,但我不知道为什么,也不知道如何防止。
最后的信息:表,列和数据库使用UTF8MB4编码与utf8mb4_general_ci排序。
我使用DBeaver(最新版本),MariaDB的版本是10.8.6

70gysomp

70gysomp1#

您应该使用proper JSON functions

UPDATE MY_TABLE
SET MY_COL = JSON_SET(MY_COL, '$.libelle', 'acteur')
WHERE JSON_VALUE(MY_COL, '$.libelle') = 'comédien';

字符串
如果你有一个这样的对象数组,你可以在一个子查询中取消嵌套它们,修改需要修改的内容,然后重新聚合。

UPDATE MY_TABLE
SET MY_COL = (
    SELECT JSON_ARRAYAGG(
      JSON_OBJECT('libelle',
        CASE WHEN j.libelle = 'comédien'
             THEN 'acteur'
             ELSE j.libelle
             END
        )
      )
    FROM JSON_TABLE(MY_COL, '$[0]' columns (
        libelle varchar(100) path '$.libelle'
    )) AS j
);

相关问题