PostgreSQL堆表元组中varchar属性值存储格式疑问
PostgreSQL堆表元组中varchar存储前缀的含义
PostgreSQL中varchar属于变长类型,采用varlena结构存储,短长度数据(≤126字节)的存储规则如下:
- 第一个字节为长度前缀:最高位固定为0,剩余7位代表数据部分的字节长度(不含前缀本身)
- 前缀之后的字节为实际的文本数据内容
针对你观察到的现象:
- 对于
'cat'的存储值\x09636174:
前缀0x09转十进制为9,表示数据部分的字节长度是9。你看到的636174(对应'cat'的3字节ASCII码)只是数据的一部分,剩余6字节应为填充的空字节(0x00),大概率是插入时数据包含额外空白字符,或是存在触发器自动将varchar(10)字段填充到最大长度。 - 对于
'x'的存储值\x0578:
前缀0x05转十进制为5,表示数据部分的字节长度是5。你看到的78(对应'x'的1字节ASCII码)仅为数据的一部分,剩余4字节为填充的空字节。
如果确认插入的是无额外空白的纯'cat'和'x',可以用pg_column_size(value)函数查看字段的实际存储总字节数,验证是否与前缀标识的长度匹配,同时检查表上是否存在触发器或自定义逻辑修改了存储数据。
内容的提问来源于stack exchange,提问作者scameeer
相关产品推荐
相关产品推荐

