达梦(DM8)对 JSON 与 XML 的使用教程

JSON

达梦提供了丰富的JSON处理函数:

sql 复制代码
-- 创建包含JSON字段的表
CREATE TABLE user_info (
    id INT,
    profile JSON,
    settings JSONB
);

-- 插入JSON数据
INSERT INTO user_info VALUES (1, '{"name": "张三", "age": 25}', '{"theme": "dark"}');

-- 查询JSON字段
SELECT id, profile->'name' as user_name FROM user_info;

-- 使用JSON函数
SELECT JSON_VALUE(profile, '$.age') as age FROM user_info;

-- 为JSON字段创建索引
CREATE INDEX idx_profile ON user_info(JSON_VALUE(profile, '$.name'));

支持的JSON类型

  1. JSON类型

    • 存储JSON文本数据

    • 数据以纯文本格式存储

    • 写入时进行基本格式验证

    • 读取时进行解析

  2. JSONB类型(DM 8.1版本起支持)

    • 以二进制格式存储JSON数据

    • 支持索引,查询性能更好

    • 存储时对键进行排序并删除重复键

    • 存储空间更小,访问速度更快

主要JSON函数

达梦提供了丰富的JSON处理函数:

  • JSON_EXTRACT() - 提取JSON值

  • JSON_VALUE() - 获取标量值

  • JSON_QUERY() - 查询JSON对象/数组

  • JSON_MODIFY() - 修改JSON数据

  • JSON_VALID() - 验证JSON格式

  • JSON_OBJECT() - 构造JSON对象

  • JSON_ARRAY() - 构造JSON数组


XML

达梦提供了丰富的xml处理函数:

sql 复制代码
-- 1. XML解析(需要将文本转换为XML对象处理)
SELECT XMLPARSE(CONTENT xml_content) FROM xml_docs;

-- 2. XML提取
SELECT EXTRACT(xmlparse(content xml_content), '/root/node') 
FROM xml_docs;

-- 3. XML验证
SELECT ISXMLVALID(xml_content) FROM xml_docs;

-- 4. 创建XML
SELECT XMLELEMENT("employee", 
         XMLATTRIBUTES(id as "emp_id"),
         XMLFOREST(name as "emp_name", dept as "department")
       ) as xml_result
FROM employees;

1. TEXT/CLOB 类型(推荐用于文本形式的XML)

sql 复制代码
-- 使用 CLOB 存储(适合大文本)
CREATE TABLE xml_docs (
    id INT PRIMARY KEY,
    xml_content CLOB,
    doc_name VARCHAR(100)
);

-- 使用 TEXT 存储(语法糖,实际是 CLOB)
CREATE TABLE xml_docs (
    id INT,
    xml_data TEXT
);

2. BLOB 类型(适合二进制或带编码的XML)

sql 复制代码
-- 如果需要保持原始字节格式
CREATE TABLE xml_files (
    id INT,
    xml_blob BLOB,
    encoding VARCHAR(20)
);

3. VARCHAR 类型(仅适用于小XML)

sql 复制代码
-- 小于 8188 字节的XML片段
CREATE TABLE config_xml (
    id INT,
    small_xml VARCHAR(8000)
);

存储建议对比

数据类型 最大容量 适用场景 注意事项
CLOB/TEXT 2^31-1字节 大型XML文档、需要文本查询 支持字符集转换
BLOB 2^31-1字节 保持原始格式、二进制XML 按字节存储,无字符集转换
VARCHAR 8188字节 小型XML配置片段 长度受限

场景一:仅存储,偶尔查询

sql 复制代码
-- 使用压缩减少存储空间
CREATE TABLE xml_archive (
    id INT,
    xml_data CLOB COMPRESS,
    create_time TIMESTAMP
);

场景二:需要频繁查询内容

sql 复制代码
-- 存储XML + 提取关键字段到关系列
CREATE TABLE orders (
    order_id INT,
    xml_data CLOB,  -- 完整XML
    order_no VARCHAR(50) AS (EXTRACTVALUE(xml_data, '/order/number')),
    customer VARCHAR(100) AS (EXTRACTVALUE(xml_data, '/order/customer')),
    INDEX idx_order_no (order_no)
);

场景三:大文件存储

sql 复制代码
-- 使用外部文件存储(DM 8.0+)
CREATE TABLE large_xml (
    id INT,
    xml_file LONGVARBINARY,  -- 指向外部文件
    file_path VARCHAR(500)
);

性能优化建议

  1. 索引关键字段:提取XML中的查询条件到关系列并创建索引

  2. 分区表:按时间对XML存储表分区

  3. 使用物化列:将频繁查询的XML节点提取为物化列

  4. 考虑版本化:大型XML可以考虑版本控制存储

达梦XML处理限制

  • 没有专门的XML数据类型(如Oracle的XMLType)

  • XML函数相比Oracle/PostgreSQL较少

  • 大XML处理性能需要考虑内存使用

如果您的XML数据需要复杂的查询和更新操作,建议:

  1. 结构化数据:考虑将XML解析后存储到关系表中

  2. 混合存储:XML原始文件 + 关键字段提取

  3. 应用层处理:在应用程序中处理XML逻辑

相关推荐
想摆烂的不会研究的研究生10 小时前
每日八股——Redis(1)
数据库·经验分享·redis·后端·缓存
码熔burning10 小时前
MySQL 8.0 新特性爆笑盘点:从青铜到王者的骚操作都在这儿了!(万字详解,建议收藏)
数据库·mysql
猫头虎10 小时前
2025最新OpenEuler系统安装MySQL的详细教程
linux·服务器·数据库·sql·mysql·macos·openeuler
哈库纳玛塔塔10 小时前
放弃 MyBatis,拥抱新一代 Java 数据访问库
java·开发语言·数据库·mybatis·orm·dbvisitor
@LetsTGBot搜索引擎机器人12 小时前
2025 Telegram 最新免费社工库机器人(LetsTG可[特殊字符])搭建指南(含 Python 脚本)
数据库·搜索引擎·机器人·开源·全文检索·facebook·twitter
计算机毕设VX:Fegn089512 小时前
计算机毕业设计|基于springboot + vue动物园管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
冉冰学姐12 小时前
SSM校园排球联赛管理系统y513u(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架应用·开题报告、
Tony Bai13 小时前
【分布式系统】03 复制(上):“权威中心”的秩序 —— 主从架构、一致性与权衡
大数据·数据库·分布式·架构
wb0430720114 小时前
SQL工坊不只是一个ORM框架
数据库·sql