如何在MariaDB的REPLACE语句中处理JSON编码字符串
MariaDB JSON字符串替换失效的解决办法
可行的UPDATE语句
直接使用实际字符或者正确的转义格式,避免过度转义:
方法1:使用实际UTF-8字符
UPDATE MY_TABLE SET MY_COL = REPLACE(MY_COL, '{"libelle": "comédien"}', '{"libelle": "acteur"}') WHERE MY_COL LIKE '%{"libelle": "comédien"}%';
方法2:使用MariaDB兼容的Unicode转义
如果客户端输入é有问题,用单层转义的Unicode序列:
UPDATE MY_TABLE SET MY_COL = REPLACE(MY_COL, '{"libelle": "com\\u00e9dien"}', '{"libelle": "acteur"}') WHERE MY_COL LIKE '%{"libelle": "com\\u00e9dien"}%';
为啥之前的UPDATE不生效?
- LIKE和REPLACE的转义逻辑不同:你之前SELECT里的
com\\u00e9dien是因为LIKE需要把\转义成\\才能让数据库识别为单个反斜杠,匹配存储的\u00e9序列。但REPLACE操作列数据时,不需要额外加一层转义——过度转义后,你要替换的字符串变成了com\u00e9dien,和列中实际的comédien(真实的é字符)不匹配,自然替换失败。 - 字符串字面量测试的特殊性:你单独用字符串测试时,两边的转义会被同步解析,所以能匹配替换,但这和列中存储的真实数据逻辑不一致,不能直接套用到UPDATE里。
更稳妥的方案:用JSON函数操作
既然存储的是JSON格式,直接用MariaDB的JSON函数更靠谱,不用纠结转义:
UPDATE MY_TABLE SET MY_COL = JSON_SET(MY_COL, '$.libelle', 'acteur') WHERE JSON_EXTRACT(MY_COL, '$.libelle') = 'comédien';
这个方法直接定位JSON的libelle键,修改其值,完全规避字符串转义的问题。
内容的提问来源于stack exchange,提问作者8oris
相关产品推荐
相关产品推荐

