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

PostgreSQL text类型短数据存储说明

作者头像
王果壳
发布2019-03-12 15:35:21
发布2019-03-12 15:35:21
2K00
代码可运行
举报
文章被收录于专栏:王硕王硕
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
复制
CREATE TABLE test ( id int, info text );

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

然后通过hexdump查看数据:

代码语言:javascript
代码运行次数:0
运行
复制
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
代码运行次数:0
运行
复制
struct varlena
{
	char		vl_len_[4];		/* Do not touch this field directly! */
	char		vl_dat[1];
};

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

代码语言:javascript
代码运行次数:0
运行
复制
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
代码运行次数:0
运行
复制
#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 归档