MySQL 8.0 JSON转义字符处理报错3141的问题求助
解决MySQL CAST为JSON时的无效转义字符问题
问题场景
执行以下MySQL代码时触发Error Code: 3141:
SET @v = '{"a":" \u3b7e - c:\user\abc - \"ET\" "}'; SET @j = CAST(@v AS JSON);
错误提示:函数cast_as_json的参数1中存在无效JSON文本:"字符串中\u转义后十六进制数字不正确。",位置18
根源是JSON解析时会把\user误认为\u开头的转义序列,但user并非合法十六进制字符,导致解析失败。
已知手动将路径改为c:\\user\\abc可正常执行,但尝试以下方法无效:
SET @v = REPLACE(@v, '\\', '\\\\');:会破坏原有合法转义(比如\u3b7e)SET @v = CONVERT(@v USING ASCII);:切换任何字符集都无法解决问题
补充规则:
- MySQL转义:
'\\'解析为'\','\u3b7e'解析为'㭾' - JSON转义:
"解析为"
解决方案
方法1:使用正则表达式精准替换(MySQL 8.0+)
通过负向断言,只转义非\u开头的单个反斜杠,避免破坏Unicode转义序列:
SET @v = '{"a":" \u3b7e - c:\user\abc - \"ET\" "}'; -- 先处理HTML实体转义 SET @v = REPLACE(@v, '"', '"'); -- 仅转义不在\u开头位置的单个反斜杠 SET @v = REGEXP_REPLACE(@v, '(?<!\\u)\\', '\\\\'); -- 转换为JSON SET @j = CAST(@v AS JSON);
原理:(?<!\\u)确保要替换的反斜杠前面不是\u,只处理路径中的单个反斜杠,保留合法的Unicode转义。
方法2:分步替换(兼容低版本MySQL)
如果你的MySQL版本不支持REGEXP_REPLACE,可以用临时标记规避冲突:
SET @v = '{"a":" \u3b7e - c:\user\abc - \"ET\" "}'; SET @v = REPLACE(@v, '"', '"'); -- 先把合法的\u替换为临时标记 SET @v = REPLACE(@v, '\\u', '__UNICODE_TEMP__'); -- 转义所有单个反斜杠 SET @v = REPLACE(@v, '\\', '\\\\'); -- 恢复Unicode转义 SET @v = REPLACE(@v, '__UNICODE_TEMP__', '\\u'); -- 转换为JSON SET @j = CAST(@v AS JSON);
内容的提问来源于stack exchange,提问作者wa56
相关产品推荐
相关产品推荐

