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

深入解析下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.kler.cn/a/413528.html

相关文章:

  • 使用Python实现自动化邮件通知:当长时程序运行结束时
  • Linux环境变量(添加环境变量、修改系统环境变量、内建命令和非内建命令)
  • 51单片机从入门到精通:理论与实践指南入门篇(三)
  • ArraList和LinkedList区别
  • aws服务--机密数据存储AWS Secrets Manager(1)介绍和使用
  • [Unity] 【游戏开发】角色设计3-如何为角色实现响应输入的控制器
  • 数据结构——用链表实现栈和队列
  • git分支管理:release分支内容重置为master
  • 零基础学安全--HTML
  • vue3+antd注册全局v-loading指令
  • CentOS上如何离线批量自动化部署zabbix 7.0版本客户端
  • Github 基本使用学习笔记
  • Sqlalchemy学习
  • java全栈day09--Maven基础知识补充
  • jmeter使用方法简介以及一个自动测试解决方案
  • 构建英语知识网站:Spring Boot框架解析
  • 摄像头原始数据读取——V4L2(mmap模式,V4L2_MEMORY_MMAP)
  • Cesium教程06_材质设置
  • Meta 发布Sapiens人类视觉模型,2D 姿势估计、人体分割、深度估计
  • GPT分区、格式化与自动挂载