0

0

SQL JSON 数据校验与清洗实践

舞姬之光

舞姬之光

发布时间:2026-02-14 21:32:34

|

353人浏览过

|

来源于php中文网

原创

安全提取json值需先验证合法性:mysql用json_valid()过滤,postgresql用json_col::jsonb is not null;入库前须清洗控制字符、修复引号格式;python中注意bytes解码;索引需与查询条件严格匹配,高频字段宜冗余为普通列。

sql json 数据校验与清洗实践

SQL 中 JSON 字段怎么安全提取值? 直接用 JSON_EXTRACT-> 操作符看似简单,但一遇到 null、格式错误或嵌套缺失字段就崩——MySQL 5.7+ 和 PostgreSQL 的 ->> 行为还不一样。关键不是“能不能取”,而是“取不到时要不要报错”。
  • MySQL 默认对非法 JSON 返回 NULL,但若字段本身是 TEXT 类型存了乱码,JSON_EXTRACT 会静默失败(不报错也不返回值),得先用 JSON_VALID() 过滤
  • PostgreSQL 更严格:-> 遇到 key 不存在返回 NULL,->> 强制转字符串,但若整个字段不是合法 JSON,查询直接报错 invalid input syntax for type json
  • 实操建议:在 WHERE 条件里加 JSON_VALID(json_col)(MySQL)或用 json_col::jsonb IS NOT NULL(PostgreSQL)兜底,别等 SELECT 里炸
SELECT id, JSON_EXTRACT(data, '$.user.name') AS name  
FROM events  
WHERE JSON_VALID(data) AND data != '';  -- 空字符串也通不过 JSON_VALID

JSON 数据入库前怎么批量清洗? 原始数据常含控制字符(\u0000)、多余空格、单引号冒充双引号、甚至 HTML 实体,直接 INSERT 进 JSON 字段,轻则解析失败,重则被截断或注入。
  • 不要用应用层 string replace 处理——比如把单引号全换双引号,可能误伤 JSON 内容里的合法单引号(如 "desc": "it's ok")
  • MySQL 8.0+ 可用 JSON_REPLACE + JSON_SET 修字段,但更稳的是用 JSON_OBJECT 重建结构;PostgreSQL 推荐先转 jsonb,它自动去重键、标准化空格、丢弃重复 key
  • 常见雷区:前端传来的 "{name: 'Alice'}"(key 没双引号)不是合法 JSON,数据库不会自动修复,必须在入库前由应用或触发器拦截

示例(MySQL):入库前用函数预检并标准化

网页制作与PHP语言应用
网页制作与PHP语言应用

图书《网页制作与PHP语言应用》,由武汉大学出版社于2006出版,该书为普通高等院校网络传播系列教材之一,主要阐述了网页制作的基础知识与实践,以及PHP语言在网络传播中的应用。该书内容涉及:HTML基础知识、PHP的基本语法、PHP程序中的常用函数、数据库软件MySQL的基本操作、网页加密和身份验证、动态生成图像、MySQL与多媒体素材库的建设等。

下载
INSERT INTO logs (data)  
SELECT JSON_OBJECT(  
  'ts', COALESCE(JSON_UNQUOTE(JSON_EXTRACT(raw, '$.ts')), NOW()),  
  'user_id', CAST(JSON_EXTRACT(raw, '$.userId') AS UNSIGNED)  
)  
FROM raw_input  
WHERE JSON_VALID(raw);

用 Python 处理 SQL JSON 字段时,json.loads() 为什么总报错? 从数据库 fetch 出来的 data 看似是字符串,但可能是 bytes(尤其用 PyMySQL 或 psycopg2),也可能是数据库自动转成 dict(如某些 ORM 启用了 JSON 解析),混用导致 json.loads()TypeError: expected string or bytes-like object
  • 先确认类型:type(row['data']) —— 如果是 bytes,必须 decode:json.loads(row['data'].decode('utf-8'))
  • 如果用 SQLAlchemy,注意 JSON 类型默认不解析,需手动 json.loads();而 JSONB(PostgreSQL)配合 psycopg2.extras.Json 可能已转 dict
  • 性能提示:高频场景别每次 json.loads(),考虑用 ujson 替代标准库,快 3–5 倍,且对 \uXXXX 转义更鲁棒

JSON 字段建索引后查询还是慢? 加了 JSON_EXTRACT(col, '$.id') 的函数索引,或 PostgreSQL 的 jsonb_path_ops,结果 EXPLAIN 显示没走索引——大概率是查询写法和索引定义不匹配。
  • MySQL 要求 WHERE 条件必须和函数索引完全一致WHERE JSON_EXTRACT(data, '$.id') = 123 才能命中,写成 = '123' 或包一层 CAST(... AS UNSIGNED) 就失效
  • PostgreSQL 的 jsonb_path_ops 索引只加速存在性查询(@>?),不加速等值查询(->>'id' = '123'),后者得用 jsonb_ops 或单独表达式索引
  • 容易漏的点:JSON 字段默认无字符集校验,如果存了 GBK 编码的乱码,索引构建阶段就出错,查不到数据还找不到原因

真正要查得快,优先把高频查询字段冗余成普通列(如 user_id INT),JSON 字段只存非结构化扩展内容——索引不是万能解药,设计时就得想好哪些值真需要查。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

942

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

334

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

375

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1636

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

369

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1210

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

583

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

434

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

76

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 9.2万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号