博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL text类型短数据存储说明
阅读量:6329 次
发布时间:2019-06-22

本文共 1463 字,大约阅读时间需要 4 分钟。

hot3.png

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

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

然后通过hexdump查看数据:

0000000 0000 0000 0140 016f 0000 0000 0020 1fc00000010 2000 2004 0000 0000 9fe0 0040 9fc0 00400000020 0000 0000 0000 0000 0000 0000 0000 0000*0001fc0 023f 0000 0000 0000 0000 0000 0000 00000001fd0 0002 0002 0802 0018 0002 0000 6409 66650001fe0 023f 0000 0000 0000 0000 0000 0000 00000001ff0 0001 0002 0802 0018 0001 0000 6109 63620002000

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

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

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

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

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

#define SET_VARSIZE_SHORT(PTR, len)                     SET_VARSIZE_1B(PTR, len)#ifdef WORDS_BIGENDIAN#define SET_VARSIZE_1B(PTR,len) \        (((varattrib_1b *) (PTR))->va_header = (len) | 0x80)#else#define SET_VARSIZE_1B(PTR,len) \        (((varattrib_1b *) (PTR))->va_header = (((uint8) (len)) << 1) | 0x01)

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

 

转载于:https://my.oschina.net/Suregogo/blog/1835838

你可能感兴趣的文章
exchange server 相关
查看>>
centos7系列安装vnc服务并授权用户访问
查看>>
CentOS mailx client
查看>>
字符串格式化
查看>>
Why Should You Choose Linux?
查看>>
NetScaler 12.1 发布
查看>>
checkpoint system management
查看>>
CentOS 6.5安全加固及性能优化_操作系统
查看>>
每天laravel-20160709|CallEvent
查看>>
我的友情链接
查看>>
【三石jQuery视频教程】02.创建 FontAwesome 复选框和单选框
查看>>
Cisco 配置DHCP中继 代理工程 实例
查看>>
Centos7.3部署KVM虚拟化环境
查看>>
configure: error: Cannot find ldap.h
查看>>
Linux启动分析(2)— bootsect.S、setup.S、head.S分析
查看>>
自学java时的笔记(一)
查看>>
Qt之文本编辑器(二)
查看>>
python编译时检查语法错误
查看>>
考题纠错2
查看>>
SQL——索引
查看>>