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

MySQL 5.7.12中JSON_EXTRACT结果去除引号的问题

解决MySQL 5.7.12中JSON_EXTRACT结果的引号问题

首先咱们拆解下你遇到的核心问题:用JSON_EXTRACT取出的mail字段带双引号,尝试REPLACE却得到了十六进制字符串——这是因为**JSON_EXTRACT返回的是JSON数据类型,而非普通字符串**,当你直接对JSON类型应用字符串函数时,MySQL会将其转换为二进制格式,所以显示成了十六进制编码。

针对MySQL 5.7.12无法使用JSON_UNQUOTE的限制,这里有两种可靠的解决方法:

方法1:先转字符串再替换引号

用CAST(或CONVERT)把JSON_EXTRACT的结果转为字符串类型,再用REPLACE去掉首尾的双引号:

SELECT 
  objectid,
  REPLACE(CAST(JSON_EXTRACT(fullobject, '$.mail') AS CHAR(255)), '"', '') AS mail
FROM openidm.managedobjects 
WHERE objecttypes_id = 5 
  AND CAST(JSON_EXTRACT(fullobject, '$.mail') AS CHAR(255)) = 'fake@email.com';

方法2:截取字符串去掉首尾引号

既然JSON_EXTRACT返回的结果固定是"xxx"格式,我们可以直接用SUBSTRING截取掉第1位和最后1位的引号:

SELECT 
  objectid,
  SUBSTRING(
    JSON_EXTRACT(fullobject, '$.mail'), 
    2, 
    CHAR_LENGTH(JSON_EXTRACT(fullobject, '$.mail')) - 2
  ) AS mail
FROM openidm.managedobjects 
WHERE objecttypes_id = 5 
  AND SUBSTRING(
    JSON_EXTRACT(fullobject, '$.mail'), 
    2, 
    CHAR_LENGTH(JSON_EXTRACT(fullobject, '$.mail')) - 2
  ) = 'fake@email.com';

为什么之前的REPLACE会失败?

在MySQL 5.7中,JSON类型的数据在参与字符串操作时会被自动转换为二进制字符串(以十六进制形式显示),你看到的6C75632E6170617369383840676D61696C2E636F6D其实就是fake@email.com的十六进制编码。通过显式转换为CHAR类型,就能彻底避免这个问题。

额外提示

在WHERE条件中,最好也对JSON_EXTRACT的结果做类型转换后再比较,这样能避免隐式转换可能带来的意外问题,确保匹配逻辑准确。

内容的提问来源于stack exchange,提问作者LucaP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:23:25