PostgreSQL数组详解

#数组中的所有整数是网络字节序大端存储模式,使用时注意转换
数组示例:

ARRAY[[1,2,3,4],[5,6,7,8]]
/*二进制存储方式,注意整数是网络字节序大端存储模式,注意二进制示例只包含了数组元素头*/
00 00 00 02 | 00 00 00 00 | 00 00 00 17 | 00 00 00 02 | 00 00 00 01 | 00 00 00 04 | 00 00 00 01

第一个整(4字节)数是维数
  00 00 00 02  表示二维数组
第二个整数(4字节)表示数组中是否有为NULL的元素
  00 00 00 00  表示没有为NULL的元素
第三个整数是数组类型的OID
  00 00 00 17  转换成十进制后值为23(23,INT4OID)表示数组类型是INT4  
第四个整数是第一个维度大小
00 00 00 02  转换成十进制后值为2,表示第一维包含二个数组
第五个整数(永远为1),每个维度的下边界
  00 00 00 01
如是是一维数组
  之后是原始数组数据(4字节长度+数据),按顺序排列
如是是多维数组**(上面的示例按这个解析)**
  第六个整数表示第二个维度大小,示例中元素数量为4
  第七个整数(永远为1),下边界
  之后是原始数组数据(4字节长度+数据),按顺序排列
  
#读取和创建数组时,根据以上规则即可

更多示例(只包含数组头),解析方法按规则即可

ARRAY[[1,2,3],[4,5,6],[7,8,9]]
  00 00 00 02 | 00 00 00 00 | 00 00 00 17 | 00 00 00 03 | 00 00 00 01 | 00 00 00 03 | 00 00 00 01
ARRAY[7,8,9,10,11,12,35,36,37,NULL]
  00 00 00 01 | 00 00 00 01 | 00 00 00 17 | 00 00 00 0a | 00 00 00 01

src\include\utils\array.h

/*-------------------------------------------------------------------------
 *
 * array.h
 *	  Declarations for Postgres arrays.
 *
 * A standard varlena array has the following internal structure:
 *	  <vl_len_>		- standard varlena header word
 *	  <ndim>		- number of dimensions of the array
 *	  <dataoffset>	- offset to stored data, or 0 if no nulls bitmap
 *	  <elemtype>	- element type OID
 *	  <dimensions>	- length of each array axis (C array of int)
 *	  <lower bnds>	- lower boundary of each dimension (C array of int)
 *	  <null bitmap> - bitmap showing locations of nulls (OPTIONAL)
 *	  <actual data> - whatever is the stored data
 */
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kmblack1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值