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

深入解析下oracle char和varchar2底层存储方式

    oracle数据库中,char和varchar2数据类型用来存储字符数据。char类型一旦定义多大,那么它就分配多少字节空间;varchar2类型定义多大,代表它可以扩展的最大大小为多大,一开始空间根据使用来决定。字符数据存储在oracle表列中,对于使用者,不需要去管它底层的存储格式是怎样。但对于想深入学习数据库的人来说,还是可以去了解下其具体的存储格式是这样的。

一、环境搭建

1.1,创建表

    我们先创建一个测试表t_code,并插入数据:

1.2,查看表段区信息

 

1.3,根据数据rowid,获取数据文件号和数据块id:

 

二、数据存储格式分析

2.1,dump数据块

    我们先把存储数据的数据块进行dump,便于后续的存储格式比对。

2.2,dump文本数据

    我们通过oracle内置的dump函数,进行name和bj字段的底层存储数据的查看:

(16进制格式)

(10进制)

2.3,比对

    我们查看下dump数据块出来的数据,比对下前端dump函数出来的数据,对比下:

    可以看到,两边数据一样

三、说明

    oracle内部,varchar2数据类型的内部代表码为1,也就是上面图中的TYP=1;char数据类型的内部代表码为96,也就是上面图中的TYP=96。根据这个内部码,oracle内部程序就知道该表该列的类型具体为什么。

    而len=5,就告知了这个字段存储所占为5个字节。

我们写个简单的c语言程序,直接解析下上述的数据:

t_oracle(){int a[] = {116,97,98,108,101};printf("tale t_code's first row column name is: ");for(int i=0;i<5;i++){printf("%c",a[i]);}printf("\n");printf("tale t_code's first row column bj is: ");int bj = 49;printf("%c",bj);
}int main() {t_oracle();}

    可以看到,我们直接就获取到第一行的name字段值为“table”,而bj字段值为“1"。深入想想,我们是否可以自己程序去读取数据文件块中的存储数据? 

http://www.lryc.cn/news/493995.html

相关文章:

  • Angular v19 (三):增量水合特性详解 - 什么是水合过程?有哪些应用场景?与 Qwik 相比谁更胜一筹?- 哪个技术好我就学哪个,这就是吸心大法吧
  • 宠物空气净化器推荐2024超详细测评 希喂VS霍尼韦尔谁能胜出
  • 一线、二线、三线技术支持
  • 智截违规,稳保安全 | 聚铭视频专网违规外联治理系统新品正式发布
  • FFmpeg 的 codec 和 format
  • 分布式锁的实现原理
  • 怎样提高自己的能量
  • ospf协议(动态路由协议)
  • 【娱乐项目】竖式算术器
  • Qt中模拟鼠标消息并与系统鼠标消息进行区分
  • 实时数据开发 | 一文理解Flink窗口机制
  • MFC 自定义树控件:树节点的样式与交互
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-loss.py
  • 像素流送api ue多人访问需要什么显卡服务器
  • 字符型注入‘)闭合
  • 评分规则的建模,用户全选就是满分10分(分数可自定义), 选2个5分, 选2个以下0分
  • Elasticsearch与NLP的深度融合:文本嵌入与向量搜索实战指南
  • 4. STM32_定时器
  • Mysql 深度分页问题及优化方案
  • 前端性能优化技巧
  • taro使用createAsyncThunk报错ReferenceError: AbortController is not defined
  • Linux:systemd进程管理【1】
  • 【Maven】继承和聚合
  • 【线上问题记录 | 排查网络连接问题】
  • springboot车辆管理系统设计与实现(代码+数据库+LW)
  • 独家|京东调整职级序列体系
  • Arrays.copyOfRange(),System.arraycopy() 数组复制,数组扩容
  • Python学习37天
  • flask的第一个应用
  • 【论文格式】同步更新中