主流数据库支持json类型,关键在于精准路径查询、生成列+索引提升性能、局部函数更新、入库前结构校验。

MySQL 5.7+ 和 PostgreSQL 等主流数据库已原生支持 JSON 数据类型,但直接当“黑盒”存取容易踩坑。关键不在能否存,而在如何高效、安全、可维护地查和改。
用路径表达式精准定位嵌套字段
JSON 字段不是字符串,不能靠 LIKE 模糊匹配;必须用标准路径语法(如 $[0].name 或 $.user.profile.age)定位值。MySQL 用 -> 提取带引号的字符串结果,->> 自动去引号(推荐多数场景);PostgreSQL 用 -> 取 JSON 对象,->> 取 text 值。
- 查数组第二项的邮箱:
WHERE data ->> '$[1].email' = 'a@b.com' - 查对象中深层布尔值:
WHERE config -> '$.feature.enabled' = true(注意:MySQL 中 JSON true/false 是关键字,不加引号) - 避免写
WHERE data LIKE '%\"status\":\"active\"%'——不可索引、易误匹配、无法校验结构
给 JSON 字段建生成列 + 索引提升查询性能
直接在 JSON 列上建索引无效。正确做法是创建虚拟(generated)列提取关键字段,再对其建索引。
Delphi 7应用编程150例 CHM全书内容下载,全书主要通过150个实例,全面、深入地介绍了用Delphi 7开发应用程序的常用方法和技巧,主要讲解了用Delphi 7进行界面效果处理、图像处理、图形与多媒体开发、系统功能控制、文件处理、网络与数据库开发,以及组件应用等内容。这些实例简单实用、典型性强、功能突出,很多实例使用的技术稍加扩展可以解决同类问题。使用本书最好的方法是通过学习掌握实例中的技术或技巧,然后使用这些技术尝试实现更复杂的功能并应用到更多方面。本书主要针对具有一定Delphi基础知识
- MySQL 示例:
ALTER TABLE orders ADD COLUMN status VARCHAR(20) GENERATED ALWAYS AS (data ->> '$.status') STORED;CREATE INDEX idx_orders_status ON orders(status); - 之后即可高效执行:
SELECT * FROM orders WHERE status = 'shipped'; - PostgreSQL 可用函数索引:
CREATE INDEX idx_users_age ON users ((data ->> 'age')::int);
安全更新 JSON 内容,避免覆盖整字段
别用 UPDATE ... SET json_col = '{"a":1,"b":2}' 覆盖全量——易丢数据、并发不安全。应使用内置函数局部修改。
- MySQL:
JSON_SET(data, '$.price', 99.9)(不存在则新增),JSON_REPLACE(data, '$.price', 89.9)(仅替换已存在字段) - 追加数组元素:
JSON_ARRAY_APPEND(data, '$.tags', 'new-tag') - PostgreSQL:
jsonb_set(data, '{status}', '"canceled"')或data || '{"updated":true}'::jsonb - 重要:所有 JSON 修改函数返回新 JSON 值,需显式赋值回字段,如
SET data = JSON_SET(data, ...)
验证与清洗 JSON 结构再入库
应用层传入的 JSON 常含格式错误、非法字符或意外空值。入库前务必校验,否则后续查询失败难排查。
- MySQL:用
JSON_VALID(data)判断是否合法,配合 CHECK 约束强制校验:ADD CONSTRAINT valid_json CHECK (JSON_VALID(config)) - PostgreSQL:jsonb 类型自动拒绝非法 JSON;若用 json 类型,可用
json_is_valid()(需扩展)或应用层处理 - 对必填字段做存在性检查:
WHERE JSON_CONTAINS_PATH(data, 'one', '$.user.id')(MySQL)
JSON 类型不是万能胶,而是结构化与灵活性之间的折中方案。用得好,省表省 JOIN;用得随意,等于把业务逻辑塞进数据库黑盒里。核心就三点:路径要准、索引要借、更新要局部、入库要验。









