当前位置: 首页 > news >正文

JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中

本文为Oracle数据库JSON学习系列的第一篇,讲述如何将JSON文档存储到数据库中,包括了版本为19c和23ai的情形。

19c中的JSON

先来看一下数据库版本为19c时的情形。

创建表colortab,其中color列的长度设为4000。若color的长度需要设为32767,则init.ora 参数 MAX_STRING_SIZE 必须设置为 EXTENDED。

DROP TABLE colortab PURGE;CREATE TABLE colortab (id    NUMBER,color VARCHAR2(4000)
);

插入4条数据:

INSERT INTO colortab VALUES ( 1,'{"color": "black","rgb": [0,0,0],"hex": "#000000"}
' );INSERT INTO colortab VALUES ( 2,'{"color": "orange red","rgb": [255,69,0],"hex": "#FF4500"}
' );INSERT INTO colortab VALUES ( 3,'{color: "gold","rgb": [255,215,0],"hex": "#FFD700 "}
' );INSERT INTO colortab VALUES ( 4,'I am not valid JSON' );COMMIT;

查看这些记录,会发现记录3的color字段并没有用双引号括起,于严格的JSON定义不符,但松散的JSON定义是允许的:
在这里插入图片描述
这可以通过如下来证明:

SQL> set echo on
SQL> SELECT id FROM colorTab WHERE color IS NOT JSON;ID
----------4SQL> 
SQL> SELECT id FROM colorTab WHERE color IS NOT JSON STRICT;ID
----------34

在Oracle 23ai JSON Developer’s Guide中,松散的语法称为Lax JSON Syntax,是默认的。严格的则称为Strict JSON Syntax。

插入一条新纪录,此记录符合Strict JSON Syntax,但具有重复的key:“color”。

INSERT INTO colortab VALUES ( 5,'{"color": "black","rgb": [0,0,0],"hex": "#000000","color": "white"}
' );COMMIT;

子句可以排除具有重复key的JSON。不过检查重复键是有代价的,所以一般是不做的:

SQL> SELECT id FROM colorTab WHERE color IS JSON STRICT;ID
----------125SQL> SELECT id FROM colorTab WHERE color IS JSON STRICT WITH UNIQUE KEYS;ID
----------12

如果只想让列存合法的JSON,在19c版本可以通过IS JSON约束。

TRUNCATE TABLE colorTab;ALTER TABLE colorTab ADD CONSTRAINT ensure_json CHECK (color IS JSON);

此时,插入记录4时报错:

错误报告 -
ORA-02290: 违反检查约束条件 (SSB.ENSURE_JSON)https://docs.oracle.com/error-help/db/ora-02290/

如果约束是CHECK (color IS JSON STRICT),则插入记录4时报错同上。

JSON的信息可以从字典视图中查看:

col table_name for a10
col column_name for a16
SELECT * FROM USER_JSON_COLUMNS WHERE table_name = 'COLORTAB';TABLE_NAME OBJEC COLUMN_NAME      FORMAT    DATA_TYPE    
---------- ----- ---------------- --------- -------------
COLORTAB   TABLE COLOR            TEXT      VARCHAR2   

最后再说一点,上例中的JSON是用VARCHAR2来存的,此外还可以用CLOB和BLOB。通常会建议BLOB,因为BLOB占用空间更小,从而引发的I/O更少。

Internally, CLOB encodes characters as UCS2 (similar to UTF16) which means every character takes up two bytes. BLOB does not perform such re-encoding but instead stores the Unicode (UTF8) bytes unmodified - thus requiring half the storage size for ASCII characters, and half the IO to load it.

23ai中的JSON

23ai支持原生JSON,因此表的定义变为:

drop table colortab purge;
CREATE TABLE colortab (id    NUMBER,color JSON
);

JSON 数据类型的实例使用 OSON 格式存储。OSON 是 Oracle 针对 Oracle 数据库服务器和 Oracle 数据库客户端中的查询和更新而优化的二进制 JSON 格式。

根据Oracle Database JSON Capabilities Specification,单个JSON实例的存储限制为32MB。

此时插入之前的5条数据。

插入记录4时,报错如下:

错误报告 -
ORA-40441: JSON 语法错误
JZN-00078: Invalid JSON keyword 'I' (line 1, position 1)https://docs.oracle.com/error-help/db/ora-40441/More Details :
https://docs.oracle.com/error-help/db/ora-40441/
https://docs.oracle.com/error-help/db/jzn-00078/

插入记录5时,报错如下:

错误报告 -
SQL 错误: ORA-40473: JSON 对象中存在重复的键名 'color'
JZN-00007: Object member key 'color' is not uniquehttps://docs.oracle.com/error-help/db/ora-40473/40473. 00000 -  "duplicate key names '%s' in JSON object"
*Cause:    The provided JavaScript Object Notation (JSON) data had duplicatekey names in one object.
*Action:   Provide JSON data with unique key names in each JSON object.More Details :
https://docs.oracle.com/error-help/db/ora-40473/
https://docs.oracle.com/error-help/db/jzn-00007/

这说明23ai JSON默认语法是Lax JSON Syntax,并且不允许重复键。文档 也是这么说的:

JSON 标准建议 JSON 对象不要有重复的字段名称。Oracle 数据库通过引发错误来强制 JSON 类型数据遵循此要求。

查看字典视图,数据类型为JSON,存储格式为OSON:

SQL> col table_name for a10
SQL> col column_name for a16
SQL> SELECT * FROM USER_JSON_COLUMNS WHERE table_name = 'COLORTAB';TABLE_NAME OBJEC COLUMN_NAME      FORMAT    DATA_TYPE    
---------- ----- ---------------- --------- -------------
COLORTAB   TABLE COLOR            OSON      JSON         

Oracle称所有非OSON存储的JSON为文本JSON(Textual JSON)。

JSON数据类型无法指定Strict JSON Syntax,按照文档5.3 Specifying Strict or Lax JSON Syntax 的说法:

Oracle 数据库的默认 JSON 语法是宽松的。严格或宽松语法仅对 SQL/JSON 条件 is json 和 is not json 有意义。所有其他 SQL/JSON 函数和条件都使用宽松语法来解释输入,并在返回输出时使用严格语法。

如果您需要确保特定文本 JSON 数据具有严格正确的语法,请先使用 is json 或 is not json 进行检查。

参考

  • Storing JSON data in the Oracle database
  • JSON Developer’s Guide

相关文章:

JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中

本文为Oracle数据库JSON学习系列的第一篇,讲述如何将JSON文档存储到数据库中,包括了版本为19c和23ai的情形。 19c中的JSON 先来看一下数据库版本为19c时的情形。 创建表colortab,其中color列的长度设为4000。若color的长度需要设为32767&a…...

[前端]HTTP库Axios

一、Axios简介 Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 node.js 环境。它是一个流行的 JavaScript 库,用于发起 HTTP 请求,如 GET、POST、DELETE 等。Axios 提供了易于使用的 API,支持请求和响应的拦截、转换数据格…...

vue3入门教程:reactive函数

基本用法 引入 reactive 首先,你需要从 vue 包中引入 reactive 函数: import { reactive } from vue;创建一个响应式对象 使用 reactive 函数来创建一个响应式对象: const state reactive({count: 0,name: Vue 3 });在这个例子中&#xff0c…...

SDMTSP:黑翅鸢算法(Black-winged kite algorithm,BKA)求解单仓库多旅行商问题,可以更改数据集和起点(MATLAB代码)

一、黑翅鸢算法BKA 黑翅鸢算法(Black-winged kite algorithm,BKA)由Wang Jun等人于2024年提出,该算法受黑翅鸢的迁徙和掠食行为启发而得。BKA集成了柯西突变策略和领导者策略,增强了算法的全局搜索能力,提…...

叉车作业如何确认安全距离——UWB测距防撞系统的应用

叉车在工业环境中运行,常常需要在狭窄的空间内完成货物的搬运和堆垛,这对操作员的技术水平和安全意识提出了极高的要求。传统的叉车作业依赖操作员的经验和视觉判断来确认安全距离,然而这种方式往往存在误差,特别是在视线受阻或光…...

5-Gin 静态文件服务 --[Gin 框架入门精讲与实战案例]

在使用 Gin 框架开发 Go 语言应用程序时,提供静态文件服务(如 HTML、CSS、JavaScript 文件等)是一个常见的需求。Gin 提供了简单的方法来设置静态文件的路由,使得你可以轻松地将这些资源提供给客户端。 使用 Static 方法 最直接…...

【自动驾驶】3 激光雷达③

5 激光雷达点云检测模型 🦋🦋🦋CenterPoint是Anchor‐Free的3D物体检测器,以点云作为输入,将三维物体在Bird‐View下的中心点作为关键点,基于关键点检测的方式回归物体的尺寸、方向和速度。相比于Anchor‐…...

Vue 3.5 编写 ref 时,自动插入.Value

如果是 Vue 3.2 ,那么可能用的是Volar...

从0到1实现一个RS蓝图系统-概念提出技术栈选型

请不要自我设限,真正好的人生态度,是现在就做,不等、不靠、不懒惰。 ——小野《改变力》 一、什么是蓝图? 蓝图(BluePrint) 是Epic Games 针对虚幻4引擎开发的可视化脚本语言。当你使用蓝图的时候,其实就是在编写代码…...

npm淘宝镜像

通过命令行配置npm的淘宝镜像源和官方镜像源,以及如何安装和使用cnpm来解决安装包卡顿或无法安装的问题。通过设置registry和disturl,配合清理缓存,可以优化npm的下载速度。 1、​官方默认镜像 npm config set registry https://registry.n…...

深入解析:Python中的决策树与随机森林

在这个数据驱动的时代,机器学习技术已经成为许多企业和研究机构不可或缺的一部分。其中,决策树和随机森林作为两种强大的算法,在分类和回归任务中表现尤为出色。本文将带领大家深入了解这两种算法在Python中的实现,从基础到实战&a…...

奇怪问题| Chrome 访问csdn 创作中心的时候报错: 服务超时,请稍后重试

Chrome 访问csdn 创作中心的时候报错: 服务超时,请稍后重试用无痕浏览器可以正常访问 关闭代理无效清缓存和Cookies无效。考虑无痕浏览器模式下插件不生效,尝试把chrome 插件也禁用,发现有效,是该扩展程序的缘故...

【Leetcode】1705. 吃苹果的最大数目

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接🔗 有一棵特殊的苹果树,一连 n n n 天,每天都可以长出若干个苹果。在第 i i i 天,树上会长出 a p p l e s [ i ] apples[i] apples[i] 个苹果&a…...

职业技能赛赛后心得

这是一位粉丝所要求的,也感谢这位粉丝对我的支持。 那么本篇文章我也是分成四个部分,来总结一下这次赛后心得。 赛中问题 那么这里的赛中问题不会只包含我所遇到的问题,也会包含赛中其他选手出现的问题。 那么首先我先说一下我在赛中遇到的…...

从AI换脸到篡改图像,合合信息如何提升视觉内容安全?

本文目录 引言一、AI“真假之战”下的发展现状与考验挑战1.1 视觉内容安全现状与技术分类1.2视觉内容安全企业1.3视觉内容安全领域挑战 二、开山之石:引领视觉内容安全的创新之路2.1合合内容安全系统2.2发起编制相关技术规范2.3参与篡改检测挑战赛 三、视觉内容安全…...

c# 实现一个简单的异常日志记录(异常迭代+分片+定时清理)+AOP Rougamo全局注入

1. 日志目录和文件管理 日志目录:日志文件存储在 ./Exceptions 目录下。日志文件命名:日志文件的命名格式为 yyyy_MM_dd.log,表示当天的日期。如果当天的日志文件大小超过 maxFileSizeBytes(3KB),则会创建…...

webrtc学习----前端推流拉流,局域网socket版,一对多

提示:局域网socket版,一对多 文章目录 [TOC](文章目录) 前言一、教程二、webrtc工作流程三、推流端四、拉流五、socket服务六、效果七、备注总结 前言 WebRTC(Web Real-Time Communication)是一种实时通讯技术,允许网…...

美国加州房价数据分析01

1.项目简介 本数据分析项目目的是分析美国加州房价数据,预测房价中值。 环境要求: ancondajupyter notebookpython3.10.10 虚拟环境: pandas 2.1.1 numpy 1.26.1 matplotlib 3.8.0 scikit-learn1.3.1 2. 导入并探索数据集 通用的数据分析…...

用Python开启人工智能之旅(四)深度学习的框架和使用方法

第四部分:深度学习的框架和使用方法 用Python开启人工智能之旅(一)Python简介与安装 用Python开启人工智能之旅(二)Python基础 用Python开启人工智能之旅(三)常用的机器学习算法与实现 用Pyt…...

两分钟解决:vscode卡在设置SSH主机,VS Code-正在本地初始化VSCode服务器

问题原因 remote-ssh还是有一些bug的,在跟新之后可能会一直加载初始化SSH主机解决方案 1.打开终端2.登录链接vscode的账号,到家目录下3.找到 .vscode-server文件,删掉这个文件4.重启 vscode 就没问题了...

GetQzonehistory:5分钟学会如何永久备份你的QQ空间历史说说

GetQzonehistory:5分钟学会如何永久备份你的QQ空间历史说说 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心那些记录着青春时光的QQ空间说说会随着时间流逝而消…...

2026制造企业产品交付周期缩短专项:6款项目管理系统选型分析

核心目标:聚焦制造企业计划协同、跨部门联动、风险前置、行业适配、落地提效五大交付周期核心痛点,梳理6款主流项目管理系统的功能特性、适配场景与核心优劣势,为制造企业结合自身需求精准选型提供客观参考依据。 一、制造企业选型核心维度&…...

FreeRTOS实时操作系统核心特性与开发实践

1. FreeRTOS 系统概述FreeRTOS作为当前嵌入式领域最流行的实时操作系统之一,已经服务全球开发者超过18年。我第一次接触这个系统是在2015年开发工业控制器时,当时需要在STM32F103上实现多任务调度。相比裸机开发,FreeRTOS提供的任务管理机制让…...

Papa Parse CSV解析完全指南:从问题诊断到性能优化的4个实战方案

Papa Parse CSV解析完全指南:从问题诊断到性能优化的4个实战方案 【免费下载链接】PapaParse Fast and powerful CSV (delimited text) parser that gracefully handles large files and malformed input 项目地址: https://gitcode.com/gh_mirrors/pa/PapaParse …...

如何快速掌握gh_mirrors/sc/screencasts中的D3.js数据可视化

如何快速掌握gh_mirrors/sc/screencasts中的D3.js数据可视化 【免费下载链接】screencasts Code that goes along with my screencasts. 项目地址: https://gitcode.com/gh_mirrors/sc/screencasts gh_mirrors/sc/screencasts是一个包含丰富D3.js教程和实例代码的项目&a…...

使用Alpine配置WSL ssh门户忌

1. 哑铃图是什么? 哑铃图(Dumbbell Plot),有时也称为DNA图或杠铃图,是一种用于比较两个相关数据点的可视化图表。 它源于人们对更有效数据比较方式的持续探索。 在传统的时间序列比较中,我们通常使用两条折…...

ERTEC 系列 PROFINET 芯片级硬件过滤器分析恫

一、语言特性:Java 26 与模式匹配进化 1.1 Java 26 语言级别支持 IDEA 2026.1 EAP 最引人注目的变化之一,就是新增 Java 26 语言级别支持。这意味着开发者可以提前体验和测试即将在 JDK 26 中正式发布的语言特性。 其中最重要的变化是对 JEP 530 的全面支…...

深入解析DSP28335三相逆变电路电压闭环程序与三相逆变数字电源程序的源代码及PDF说明,详...

DSP28335,三相逆变电路电压闭环程序,三相逆变数字电源程序。 包括源代码文件和PDF说明文件。 详细说明了代码含义,三相逆变电路电路电压闭环分析,电路设计步骤,软件设计流程,软件调试步骤等。最近在搞三相逆…...

webflux接收application/x-www-form-urlencoded参数

记录开发中遇到的问题 请求方式:需要用如下方式接收: 方式1PostMapping(value "/user/logout", consumes "application/x-www-form-urlencoded")public ResponseResult logoutForAuthSystem(ServerWebExchange exchange) {exchang…...

CustomTkinter:如何用Python轻松打造现代化桌面应用界面

CustomTkinter:如何用Python轻松打造现代化桌面应用界面 【免费下载链接】CustomTkinter A modern and customizable python UI-library based on Tkinter 项目地址: https://gitcode.com/gh_mirrors/cu/CustomTkinter 厌倦了传统Tkinter老旧的界面风格&…...