MySQL JSON_UNQUOTE 怎样去掉 JSON 字符串外层引号
如果 JSON 字段里的字符串拿到应用层后变成了 "Alice",而不是你想要的 Alice,通常需要的是 JSON_UNQUOTE()。它会按 JSON 字符串规则去掉外层双引号并处理转义;但数组、对象等非字符串值不会凭空变成普通文本。
官方地址:https://dev.mysql.com/doc/refman/8.4/en/json-modification-functions.html#function_json-unquote
我在整理 JSON 查询结果时,最容易混淆的是三层引号:SQL 语句的字符串字面量、JSON 字符串自己的双引号,以及应用层最终要消费的文本。下面按这三层关系,把取值、转义和边界拆开。
JSON_UNQUOTE 到底去掉了什么
JSON_UNQUOTE(json_val) 接收一个 JSON 值,返回 utf8mb4 字符串。输入是 JSON 字符串时,结果会去掉字符串值的外层双引号;输入是数组或对象时,结果仍然是它们的 JSON 文本表示,不应把它理解成“所有 JSON 都转成业务字符串”。

例如下面的 SQL 中,最外层单引号属于 SQL 字符串字面量,里面的双引号才是 JSON 字符串的一部分:
-- SQL 单引号包住输入,JSON 双引号包住字符串值
SET @name_json = '"Alice"';
-- JSON_UNQUOTE 去掉 JSON 字符串的外层双引号
SELECT JSON_UNQUOTE(@name_json) AS name_text;
-- 数组不是 JSON 字符串,结果仍保持数组文本
SELECT JSON_UNQUOTE('[1, 2, 3]') AS array_text;
第一个结果是普通文本 Alice,第二个结果仍是 [1, 2, 3]。因此,如果应用只需要姓名、状态码这类标量字段,JSON_UNQUOTE 很合适;如果需要继续访问数组元素,则应保留 JSON 值交给后续 JSON 函数。
从 JSON_EXTRACT 取字段时,为什么常常还要再解引号
JSON_EXTRACT() 返回的是 JSON 值。对字符串字段来说,它通常带着 JSON 引号;把结果直接交给普通 SQL 文本或应用响应,就容易出现“多了一层引号”的感觉。可以把显式写法和快捷操作符放在一起比较:
-- 建立一个包含字符串、数字和数组的 JSON 文档
SET @doc = '{"name":"Alice","age":30,"tags":["go","mysql"]}';
-- JSON_EXTRACT 返回 JSON 字符串值,字符串仍带 JSON 引号
SELECT JSON_EXTRACT(@doc, '$.name') AS json_name;
-- 显式去掉字符串外层引号
SELECT JSON_UNQUOTE(JSON_EXTRACT(@doc, '$.name')) AS plain_name;
-- ->> 是“取路径并取消引用”的常用简写
SELECT @doc->>'$.name' AS plain_name_short;
-- 数字与数组不应套用“去引号后就是普通文本”的假设
SELECT JSON_UNQUOTE(JSON_EXTRACT(@doc, '$.age')) AS age_value,
JSON_UNQUOTE(JSON_EXTRACT(@doc, '$.tags')) AS tags_value;
这里的判断重点不是函数名长短,而是输出类型:name 是 JSON 字符串,适合得到普通文本;age 是 JSON 数字,tags 是 JSON 数组,输出仍应按 JSON 值理解。若 SQL 只是把标量字段投影给应用层,我会优先使用 ->> 或显式组合;若要表达每一步的类型变化,显式写法更容易排查。
转义字符和 SQL 模式要一起看
JSON_UNQUOTE 不只是删除两个双引号。MySQL 会识别 JSON 字符串中的部分转义序列,例如 \\n、\\t、\\\"、\\\\ 和 \\uXXXX。这些序列是否按反斜杠转义解释,还会受到会话 SQL 模式 NO_BACKSLASH_ESCAPES 的影响。

-- 输入明确成为 JSON 字符串,并包含制表符与 Unicode 转义
SELECT JSON_UNQUOTE('"\\t\\u0032"') AS decoded_text;
-- 检查当前会话模式;它会影响反斜杠的解释方式
SELECT @@sql_mode AS current_sql_mode;
-- 比较模式差异时,只在当前会话临时设置并恢复原值
SET @old_mode = @@sql_mode;
SET SESSION sql_mode = 'NO_BACKSLASH_ESCAPES';
SELECT JSON_UNQUOTE('"\\t\\u0032"') AS literal_mode_text;
SET SESSION sql_mode = @old_mode;
如果换行、制表符或 Unicode 字符的结果与预期不同,先确认输入到底是 JSON 文本还是已经被客户端解析过的文本,再确认会话是否启用了 NO_BACKSLASH_ESCAPES。不要在应用层盲目再做一次反转义,否则可能把原本正确的反斜杠再次改写。
四个边界决定是否应该使用 JSON_UNQUOTE
| 输入情况 | 适合的判断 | 注意点 |
|---|---|---|
| JSON 字符串 | 使用 JSON_UNQUOTE 或 ->> | 去掉 JSON 外层引号并处理规定的转义 |
| 数组或对象 | 保留 JSON 值,继续用 JSON 函数 | 不要把 JSON 文本当成已解析的业务字段 |
| SQL NULL | 先处理 NULL 语义 | JSON_UNQUOTE(NULL) 返回 NULL |
| 带引号但不是合法 JSON 字符串 | 先修正输入或检查生成端 | 可能直接产生错误,不能靠函数强行剥皮 |
实践中我会把“去掉 JSON 引号”和“把值转换成业务类型”分成两个动作。JSON_UNQUOTE 解决的是 JSON 字符串表示层;如果业务字段还需要日期、整数或布尔语义,应再使用明确的类型转换,并在接口契约里说明空值和非法值如何处理。
常见追问
JSON_UNQUOTE 能把 JSON 数组转换成逗号分隔字符串吗?
不能把它当成数组格式化函数。它对数组会保留 JSON 数组文本;如果要逐个元素处理,应使用 JSON_TABLE 或路径访问,再按业务规则聚合。
JSON_EXTRACT 和 ->> 应该选哪一个?
需要保留 JSON 类型、继续做 JSON 运算时使用 JSON_EXTRACT;只把字符串标量投影为普通文本时,显式的 JSON_UNQUOTE(JSON_EXTRACT(...)) 或 ->> 更直接。
为什么同一条 JSON_UNQUOTE 在不同环境输出不同?
优先检查输入是否经过了客户端转义,以及当前会话的 sql_mode 是否包含 NO_BACKSLASH_ESCAPES。JSON 转义和 SQL 字符串转义是两层规则,不能只看最终 SQL 表面。
一句话总结:JSON_UNQUOTE 负责把 JSON 字符串值还原为可消费的普通文本,不负责把所有 JSON 类型都扁平化。先确认字段是字符串、数字还是数组对象,再决定使用显式组合、->> 或继续保留 JSON 值,后续排查会清晰很多。
MySQL 直方图统计信息怎样帮助优化器选择计划
- 上一篇
- MySQL 直方图统计信息怎样帮助优化器选择计划
- 下一篇
- MySQL 一致性读为什么看不到刚提交的数据
-
- 数据库 · MySQL | 31分钟前 |
- MySQL SET_VAR hint 怎样为单条查询临时调整排序内存
- 257浏览 收藏
-
- 数据库 · MySQL | 32分钟前 | MySQL · utf8mb4 ·
- MySQL utf8mb4_0900_ai_ci 怎样处理重音字符比较
- 369浏览 收藏
-
- 数据库 · MySQL | 34分钟前 |
- MySQL gap lock 为什么阻塞范围外的插入
- 191浏览 收藏
-
- 数据库 · MySQL | 35分钟前 | MySQL · InnoDB · mysql READ COMMITTED REPEATABLE READ 一致性读 事务快照
- MySQL 一致性读为什么看不到刚提交的数据
- 499浏览 收藏
-
- 数据库 · MySQL | 41分钟前 |
- MySQL 直方图统计信息怎样帮助优化器选择计划
- 400浏览 收藏
-
- 数据库 · MySQL | 43分钟前 |
- MySQL REGEXP_REPLACE 怎样清理字段中的连续空格
- 308浏览 收藏
-
- 数据库 · MySQL | 47分钟前 |
- MySQL optimizer_switch derived_merge 怎样临时关闭派生表合并
- 423浏览 收藏
-
- 数据库 · MySQL | 48分钟前 |
- MySQL FOR SHARE 怎样在一致性读中使用共享锁
- 389浏览 收藏
-
- 数据库 · MySQL | 48分钟前 | MySQL · mysql 窗口函数 并列排名 DENSE_RANK
- MySQL DENSE_RANK 怎样保留并列排名记录
- 161浏览 收藏
-
- 数据库 · MySQL | 50分钟前 |
- MySQL 隐形索引怎样安全观察删除影响
- 500浏览 收藏
-
- 数据库 · MySQL | 52分钟前 |
- MySQL 降序索引怎样配合 ORDER BY 减少排序
- 121浏览 收藏
-
- 数据库 · MySQL | 54分钟前 |
- MySQL SHOW WARNINGS 怎样定位数据截断和隐式转换
- 188浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 761次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 758次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 842次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 810次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 640次使用
-
- MySQL JSON_TABLE 展开数组时如何保留缺失字段
- 2026-09-10 501浏览
-
- MySQL 分区表怎么处理跨分区唯一键:分区列约束与建表取舍
- 2026-08-30 501浏览
-
- MySQL权限管理设置全攻略
- 2026-03-29 501浏览
-
- MySQL分片实现方法及常见方案解析
- 2025-06-24 501浏览
-
- MySQL表空间碎片怎么清理?超详细优化教程
- 2025-06-13 501浏览

