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:
 *	  		- standard varlena header word
 *	  		- number of dimensions of the array
 *	  	- offset to stored data, or 0 if no nulls bitmap
 *	  	- element type OID
 *	  	- length of each array axis (C array of int)
 *	  	- lower boundary of each dimension (C array of int)
 *	   - bitmap showing locations of nulls (OPTIONAL)
 *	   - whatever is the stored data
 */

你可能感兴趣的:(PostgreSQL二次开发,postgresql,C++)