前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostgreSQL text类型短数据存储说明

PostgreSQL text类型短数据存储说明

作者头像
王果壳
发布2019-03-12 15:35:21
1.9K0
发布2019-03-12 15:35:21
举报
文章被收录于专栏:王硕王硕

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

代码语言:javascript
复制
CREATE TABLE test ( id int, info text );

INSERT INTO test VALUES (1, ‘abc’), (2, ‘def’);

然后通过hexdump查看数据:

代码语言:javascript
复制
0000000 0000 0000 0140 016f 0000 0000 0020 1fc0
0000010 2000 2004 0000 0000 9fe0 0040 9fc0 0040
0000020 0000 0000 0000 0000 0000 0000 0000 0000
*
0001fc0 023f 0000 0000 0000 0000 0000 0000 0000
0001fd0 0002 0002 0802 0018 0002 0000 6409 6665
0001fe0 023f 0000 0000 0000 0000 0000 0000 0000
0001ff0 0001 0002 0802 0018 0001 0000 6109 6362
0002000

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

代码语言:javascript
复制
struct varlena
{
	char		vl_len_[4];		/* Do not touch this field directly! */
	char		vl_dat[1];
};

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

代码语言:javascript
复制
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起的作用:

代码语言:javascript
复制
#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。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/06/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档