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类型
JSON类型
存储JSON文本数据
数据以纯文本格式存储
写入时进行基本格式验证
读取时进行解析
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)
);
性能优化建议
索引关键字段:提取XML中的查询条件到关系列并创建索引
分区表:按时间对XML存储表分区
使用物化列:将频繁查询的XML节点提取为物化列
考虑版本化:大型XML可以考虑版本控制存储
达梦XML处理限制
没有专门的XML数据类型(如Oracle的XMLType)
XML函数相比Oracle/PostgreSQL较少
大XML处理性能需要考虑内存使用
如果您的XML数据需要复杂的查询和更新操作,建议:
结构化数据:考虑将XML解析后存储到关系表中
混合存储:XML原始文件 + 关键字段提取
应用层处理:在应用程序中处理XML逻辑