varattrib_4b总结:
- 所有变长类型的判断 都 使用第一个字节:
- 0x00 (0bxxxx xxx0):is 4B(未压缩数据varattrib_4b,最大1G)
- 0x00 (0bxxxx xx00):is 4B_U(未压缩数据varattrib_4b,第二个二进制如果没用使用且长度满足,可以把4B转换为1B)
- 0x00 (0bxxxx xx10):is 4B_C(压缩数据varattrib_4b,最大1G,用于判断是否压缩)
- 0x00 (0bxxxx xxx1):is 1B(未压缩数据,1B断类型,最大126b)
- 0x00 (0b0000 0001):is 1B_E(TOAST专用)
- 4B头共32个二进制位,低2位存控制数据,长度保存在高30位中(注意len永远包含header的4字节,所以能保存的数据是1G-4B)
- 长度保存:va_header = (uint32) (len) << 2
- 30个二进制位len范围:0 - 1073741824 B (2^30) == 1024MB
- 长度读取:(va_header >> 2) & 0x3FFFFFFF
- 0x3FFFFFFF == 0b0011 1111 1111...右移两位后只需取低30位
- 长度保存:va_header = (uint32) (len) << 2
- 1B的头共8个二进制位,低1位存控制数据,长度保存在高7位中(注意len永远包含header的1字节,所以能保存的数据是128B-1B)
- 长度保存:va_header = (uint8) (len) << 1) | 0x01
- 7个二进制len范围:0 - 128 B (2^7) ,控制位顺便加个1表示当前是varattrib_1b
- 长度读取:(va_header >> 1) & 0x7F
- 0x7F == 0b0111 1111 右移一位后只需取低7位
- 长度保存:va_header = (uint8) (len) << 1) | 0x01
- 4B到1B的转换
- 4B的头是4字节,1B的头是1字节,转换也提供了几个宏,简单的说就是判断数据len能不能被1B装得下:VARATT_CAN_MAKE_SHORT
text支持大量字符换操作函数,匹配C++标准库,字符串操作函数一般都不需要自己写,用时先查询varlena.c
textpostgresql中经常可以看到text类型,直接调试时可以看到这样的结果:
(gdb) p *t
$6 = {vl_len_ = "<

