PostgreSQL text类型短数据存储说明

今天在查看数据库数据文件时,进行一下操作:

1CREATE TABLE test ( id int, info text ); 2 3INSERT INTO test VALUES (1, ‘abc’), (2, ‘def’);

然后通过hexdump查看数据:

10000000 0000 0000 0140 016f 0000 0000 0020 1fc0 20000010 2000 2004 0000 0000 9fe0 0040 9fc0 0040 30000020 0000 0000 0000 0000 0000 0000 0000 0000 4* 50001fc0 023f 0000 0000 0000 0000 0000 0000 0000 60001fd0 0002 0002 0802 0018 0002 0000 6409 6665 70001fe0 023f 0000 0000 0000 0000 0000 0000 0000 80001ff0 0001 0002 0802 0018 0001 0000 6109 6362 90002000

发现text类型中的abc和def在数据文件表示为 09616263和09646566,查看代码可知text类型其实为varlena,他的结构为:

1struct varlena 2{ 3 char vl_len_[4]; /* Do not touch this field directly! */ 4 char vl_dat[1]; 5};

前四个字节为长度标识,在这里只有一个字节,而且3个字符的长度为9,百思不得其解啊,遂进行调查,发现,这是因为插入数据较短,数据库给优化了,将原来长度为4个字节的标识为变成了1个:

1else if (VARLENA_ATT_IS_PACKABLE(att[i]) && 2 VARATT_CAN_MAKE_SHORT(val)) 3 { 4 /* convert to short varlena -- no alignment */ 5 data_length = VARATT_CONVERTED_SHORT_SIZE(val); 6 7 SET_VARSIZE_SHORT(data, data_length); 8 memcpy(data + 1, VARDATA(val), data_length - 1); 9}

这里主要是由于SET_VARSIZE_SHORT起的作用:

1#define SET_VARSIZE_SHORT(PTR, len) SET_VARSIZE_1B(PTR, len) 2 3#ifdef WORDS_BIGENDIAN 4 5#define SET_VARSIZE_1B(PTR,len) \ 6 (((varattrib_1b *) (PTR))->va_header = (len) | 0x80) 7 8#else 9 10#define SET_VARSIZE_1B(PTR,len) \ 11 (((varattrib_1b *) (PTR))->va_header = (((uint8) (len)) << 1) | 0x01)

so, 考虑到‘\0’占位情况,即3+1=4,4 << 1 = 8, 8 | 0x01 = 9,于是这里便是9。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

PostgreSQL text类型短数据存储说明 - HelloWorld