You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 = '{&quot;a&quot;:&quot; \u3b7e - c:\user\abc - \&quot;ET\&quot; &quot;}';
SET @v = REPLACE(@v, '&quot;', '"');
-- 先把合法的\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:34:54