MySQL 5.7 实战:JSON 字段提取、Base64 解码与引号问题全解析

一、背景与问题场景

在 MySQL 数据库中,存储 JSON 格式数据(如用户行为日志、配置参数、扩展信息)的场景日益普遍。当需要从 JSON 字段中提取特定键值(如info)并进行 Base64 解码时,常遇到以下问题:

  • 引号干扰:JSON 字符串值自带双引号,直接提取后 Base64 解码失败。
  • 数据合法性:JSON 字段可能非法(如格式错误),导致提取失败。
  • 填充缺失:Base64 编码值可能缺失末尾的=填充符,影响解码。

本文结合 MySQL 5.7 的官方函数与实战验证,完整解析从 JSON 字段提取到 Base64 解码的全流程,并重点解决引号问题。

二、核心技术:MySQL 5.7 的 JSON 与 Base64 函数

1. JSON 字段处理函数

MySQL 5.7 对 JSON 的支持依赖以下核心函数 / 操作符:

函数 / 操作符作用官方文档链接
->> 操作符json_col ->> '$.key' 等价于 JSON_UNQUOTE(JSON_EXTRACT(json_col, '$.key')),提取 JSON 键值并自动去引号。MySQL 5.7 JSON 函数
JSON_VALID(expr)校验expr是否为合法 JSON 字符串(返回 1 表示合法,0 或 NULL 表示非法)。同上

2. Base64 解码函数:FROM_BASE64(str)

MySQL 5.6.17 及以上版本支持FROM_BASE64(str),可将 Base64 编码的字符串str解码为二进制数据。若str非 Base64 格式(如含非法字符),返回NULL

官方说明

"Converts the string str from Base64 to a binary string. Returns NULL if str is not a valid Base64 string."
—— MySQL 5.7 字符串函数文档

三、引号问题的本质与验证

1. 引号问题的根源:JSON 格式规范

JSON 标准规定,字符串值必须用双引号包裹(如"value")。因此,使用JSON_EXTRACT提取 JSON 字符串类型的键值时,返回结果会保留外层双引号。例如:

  • 原始 JSON:{"info": "SGVsbG8="}
  • JSON_EXTRACT(log_content, '$.info')的结果:"SGVsbG8="(双引号是 JSON 格式的一部分)

2. 验证:引号对 Base64 解码的影响

为验证引号的干扰,构造测试表test_table(数据如下):

idlog_content说明
1{"info": "SGVsbG8gTXlTUUw="}合法 JSON,info值为 Base64 字符串(无额外引号)
2{"info": ""SGVsbG8gTXlTUUw=""}合法 JSON,info值含额外双引号(如"value"
3{"info": SGVsbG8gTXlTUUw=}非法 JSON(info值未用双引号包裹)
测试 1:直接使用JSON_EXTRACT提取并解码

sql

SELECT id,JSON_EXTRACT(log_content, '$.info') AS info_with_quotes,  -- 带引号的原始值FROM_BASE64(JSON_EXTRACT(log_content, '$.info')) AS decoded_with_quotes  -- 含引号的解码结果
FROM test_table;

输出结果

idinfo_with_quotesdecoded_with_quotes
1"SGVsbG8gTXlTUUw="NULL(引号导致 Base64 解码失败)
2""SGVsbG8gTXlTUUw=""NULL(双引号被转义,仍无法解码)
3NULLNULL(非法 JSON,提取失败)
测试 2:使用->>操作符自动去引号

->>操作符通过JSON_UNQUOTE自动移除 JSON 字符串的外层引号,避免手动处理:

sql

SELECT id,log_content ->> '$.info' AS info_clean,  -- 自动去引号FROM_BASE64(log_content ->> '$.info') USING utf8mb4 AS decoded  -- 直接解码
FROM test_table
WHERE JSON_VALID(log_content);  -- 仅处理合法JSON

输出结果

idinfo_cleandecoded
1SGVsbG8gTXlTUUw=Hello MySQL(成功解码)
2"SGVsbG8gTXlTUUw"(乱码或 NULL)(原始值含额外引号,->>仅移除最外层引号)
测试结论
  • 引号是 Base64 解码失败的主因:JSON 字符串的外层引号会被误认为 Base64 的一部分,导致解码失败。
  • ->>是最优解:自动移除 JSON 外层引号,避免手动REPLACE的错误风险。

四、实战:从 JSON 提取到 Base64 解码的完整流程

1. 步骤 1:校验 JSON 合法性

通过JSON_VALID过滤非法 JSON 数据,避免->>解析失败:

sql

SELECT log_content ->> '$.info' AS info_encoded,FROM_BASE64(log_content ->> '$.info') USING utf8mb4 AS info_decoded
FROM log_table
WHERE JSON_VALID(log_content);  -- 仅处理合法JSON行

2. 步骤 2:提取 JSON 键值并去引号

使用->>操作符提取info键值,自动去引号:

sql

log_content ->> '$.info'  -- 结果为无外层引号的Base64字符串(如SGVsbG8gTXlTUUw=)

3. 步骤 3:Base64 解码并指定字符集

FROM_BASE64解码后返回二进制数据,需指定字符集(如utf8mb4)转为文本:

sql

FROM_BASE64(log_content ->> '$.info') USING utf8mb4 AS info_decoded  -- 解码为UTF-8字符串

4. 优化:处理填充缺失与键缺失

  • 填充缺失:手动补全 Base64 填充符(每 4 字符一组):

    sql

    FROM_BASE64(LPAD(log_content ->> '$.info', CEIL(LENGTH(log_content ->> '$.info')/4)*4, '=')) USING utf8mb4
    
  • 键缺失:通过IFNULL提供默认提示:

    sql

    IFNULL(FROM_BASE64(log_content ->> '$.info') USING utf8mb4, 'info键不存在或值无效') AS info_decoded
    

五、真实应用案例

案例 1:电商用户行为日志分析

某电商平台的用户行为日志表user_action_log中,log_data字段存储如下 JSON:

json

{"user_id": 1001, "action": "purchase", "info": "eyJwb2ludHMiOjE1MCwidGltZSI6IjIwMjUtMDUtMjEifQ=="}

通过以下 SQL 提取并解码info键(记录用户积分和操作时间):

sql

SELECT user_id,log_data ->> '$.action' AS action,FROM_BASE64(log_data ->> '$.info') USING utf8mb4 AS action_detail
FROM user_action_log
WHERE JSON_VALID(log_data)AND log_data ->> '$.action' = 'purchase';

解码后action_detail{"points":150,"time":"2025-05-21"},可直接用于用户行为分析。

案例 2:系统配置参数动态解析

某系统的app_config表存储 JSON 格式的动态配置(如支付模块的货币类型):

json

{"module": "payment", "info": "emN1cnJlbmN5IjoiVVNEIn0="}

通过以下 SQL 提取并解码info键:

sql

SELECT module,FROM_BASE64(info_encoded) USING utf8mb4 AS config_detail
FROM (SELECT log_data ->> '$.module' AS module,log_data ->> '$.info' AS info_encodedFROM app_config
) t
WHERE module = 'payment';

解码后config_detail{"currency":"USD"},可直接用于业务逻辑。

六、权威资料与最佳实践

1. 权威资料验证

  • MySQL 官方文档:明确->>操作符的行为是JSON_UNQUOTE(JSON_EXTRACT(...))(链接)。
  • JSON 标准规范:字符串值必须用双引号包裹(RFC 7159)。

2. 最佳实践建议

  • 优先使用->>操作符:自动去引号,避免手动REPLACE的错误。
  • 显式校验 JSON 合法性:通过JSON_VALID过滤非法数据,确保提取可靠性。
  • 索引优化:对高频查询的 JSON 键(如info),通过生成列 + 索引加速查询:

    sql

    ALTER TABLE log_table 
    ADD COLUMN info_encoded VARCHAR(255) GENERATED ALWAYS AS (log_content ->> '$.info') STORED,
    ADD INDEX idx_info_encoded (info_encoded);
    

总结

在 MySQL 5.7 中处理 JSON 字段与 Base64 解码,核心是掌握->>操作符的自动去引号能力,并结合JSON_VALID校验数据合法性。通过本文的实战验证与案例分析,可高效解决引号干扰、数据非法、填充缺失等常见问题,确保解码结果的准确性与可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/81956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自研Rise系列之BI简单易用的大屏系统

BI系统是制作可视化大屏报表的常用工具之一,因其具备实时更新、综合分析多来源数据、直观展现分析结果、支持多维自助分析等特点而广受欢迎。在BI系统上设计制作可视化大屏后,只需接入大屏硬件即可,因此BI系统的选择就成了重中之重。 在可视化…

飞桨paddle import fluid报错【已解决】

跟着飞桨的安装指南安装了paddle之后 pip install paddlepaddle有一个验证: import paddle.fluid as fluid fluid.install check.run check()报错情况如下,但是我在pip list中,确实看到了paddle安装上了 我import paddle别的包&#xff0c…

第18天-NumPy + Pandas + Matplotlib多维度直方图

示例1:带样式的柱状图 python 复制 下载 import numpy as np import pandas as pd import matplotlib.pyplot as plt# 生成数据 df = pd.DataFrame(np.random.randint(10, 100, size=(8, 4)),columns=[Spring, Summer, Autumn, Winter],index=[2015, 2016, 2017, 2018, 20…

关于 Web 安全实践:4. 文件上传功能的风险分析与防护

定义:文件上传风险点是指应用程序允许用户上传文件,但没有严格校验上传文件的类型、内容、路径等属性,导致攻击者可以上传并执行恶意代码。 绕过方式: 前端绕过 1. 前端限制的原理 前端限制上传文件类型的常见方式有三种&#…

升级SpringBoot2到3导致的WebServices升级

背景 WebServices 是基于开放标准(XML、SOAP、HTTP 等)的 Web 应用程序,它们与其他 Web 应 用程序交互以交换数据。WebServices 可以将您现有的应用程序转换为 Web 应用程序。 老代码中有一个19年前的包,由于漏洞原因,…

Vue3中插槽, pinia的安装和使用(超详细教程)

1. 插槽 插槽是指, 将一个组件的代码片段, 引入到另一个组件。 1.1 匿名插槽 通过简单的案例来学习匿名插槽,案例说明,在父组件App.vue中导入了子组件Son1.vue,父组件引用子组件的位置添加了一个片段,比如h2标签,然…

【Redis】AOF日志

目录 1、背景2、工作原理3、核心配置参数4、优缺点5、AOF文件内容 1、背景 AOF(Append Only File)是redis提供的持久化机制之一,它通过记录所有修改数据库状态的写命令来实现数据库持久化。与RDB(快照)方式不同&#…

【HTTP】connectionRequestTimeout与connectTimeout的本质区别

今天发现有的伙伴调用第三方 httpclient 的配置中 connectTimeout 和 connectionRequestTimeout 配置的不到 1 S,问了一下他,知不知道这两个参数的意思,他说不知道。那我们今天就来了解一下这两个参数的区别 一、核心概念解析 1.1 connectT…

react中运行 npm run dev 报错,提示vite.config.js出现错误 @esbuild/win32-x64

在React项目中运行npm run dev时,如果遇到vite.config.js报错,提示esbuild/win32-x64在另一个平台中被使用,通常是由于依赖冲突或缓存问题导致的。解决方法是删除node_modules文件夹,并重新安装依赖。 如下图: 解决办…

EMQX开源版安装指南:Linux/Windows全攻略

EMQX开源版安装教程-linux/windows 因最近自己需要使用MQTT,需要搭建一个MQTT服务器,所以想到了很久以前用到的EMQX。但是当时的EMQX使用的是开源版的,在官网可以直接下载。而现在再次打开官网时发现怎么也找不大开源版本了,所以…

Python:操作Excel按行写入

Python按行写入Excel数据,5种实用方法大揭秘! 在日常的数据处理和分析工作中,我们经常需要将数据写入到Excel文件中。Python作为一门强大的编程语言,提供了多种库和方法来实现将数据按行写入Excel文件的功能。本文将详细介绍5种常见的Python按行写入Excel数据的方法,并附上…

vue3中RouterView配合KeepAlive实现组件缓存

KeepAlive组件缓存 为什么需要组件缓存代码展示缓存效果为什么不用v-if 为什么需要组件缓存 业务需求&#xff1a;一般是列表页面通过路由跳转到详情页&#xff0c;跳转回来时&#xff0c;需要列表页面展示上次展示的内容 代码展示 App.vue入口 <script setup lang"…

【JAVA】比较器Comparator与自然排序(28)

JAVA 核心知识点详细解释 Java中比较器Comparator的概念和使用方法 概念 Comparator 是 Java 中的一个函数式接口,位于 java.util 包下。它用于定义对象之间的比较规则,允许我们根据自定义的逻辑对对象进行排序。与对象的自然排序(实现 Comparable 接口)不同,Comparat…

浪潮服务器配置RAID和JBOD

目录 1 配置RAID2 设置硬盘为JBOD模式3 验证结果 1 配置RAID 进入 bios 界面 选择 “高级” - “UEFI-HII配置” 选择 raid 卡 进入 Main Menu 点击 Driver Management&#xff0c;可以查询当前硬盘 返回上一级&#xff0c;点击 Configuration Management - Create virtu…

mongodb管理工具的使用

环境&#xff1a; 远程服务器的操作系统&#xff1a;centOS stream 9; mongoDB version:8.0; 本地电脑 navicat premium 17.2 ; 宝塔上安装了mongoDB 目的&#xff1a;通过本地的navicat链接mongoDB,如何打通链接&#xff0c;分2步&#xff1a; 第一步&#xff1a;宝塔-&…

03-Web后端基础(Maven基础)

1. 初始Maven 1.1 介绍 Maven 是一款用于管理和构建Java项目的工具&#xff0c;是Apache旗下的一个开源项目 。 Apache 软件基金会&#xff0c;成立于1999年7月&#xff0c;是目前世界上最大的最受欢迎的开源软件基金会&#xff0c;也是一个专门为支持开源项目而生的非盈利性…

实景VR展厅制作流程与众趣科技实景VR展厅应用

实景VR展厅制作是一种利用虚拟现实技术将现实世界中的展览空间数字化并在线上重现的技术。 这种技术通过三维重建和扫描等手段&#xff0c;将线下展馆的场景、展品和信息以三维形式搬到云端数字空间&#xff0c;从而实现更加直观、立体的展示效果。在制作过程中&#xff0c;首…

Python爬虫实战:获取天气网最近一周北京的天气数据,为日常出行做参考

1. 引言 随着互联网技术的发展,气象数据的获取与分析已成为智慧城市建设的重要组成部分。天气网作为权威的气象信息发布平台,其数据具有较高的准确性和实时性。然而,人工获取和分析天气数据效率低下,无法满足用户对精细化、个性化气象服务的需求。本文设计并实现了一套完整…

几种超声波芯片的特点和对比

一 CX20106A ZIP - 8 CX20106A ZIP - 8 的核心竞争力在于高性价比、易用性和抗光干扰能力&#xff0c;尤其适合消费电子、短距离工业检测和低成本物联网场景。尽管在距离和精度上不及高端芯片&#xff0c;但其成熟的电路方案和广泛的市场应用&#xff08;如经典红外遥控升级为超…

利用ffmpeg截图和生成gif

从视频中截取指定数量的图片 ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 output.jpgffmpeg -i input.mp4 -ss 00:00:10 -vframes 180 output.jpg -vframes 180代表截取180帧, 实测后发现如果视频是60fps,那么会从第10秒截取到第13秒-i input.mp4&#xff1a;指定输入视频文…