七叶笔记 » 数据库 » Postgres bytea类型 转换及查看操作

Postgres bytea类型 转换及查看操作

如上所示,查询的结果为插入不同整型范围的最值,也说明不同整型范围的边界都是被包括的。在实际生产场景中,SMALLINT、INTEGER和BIGINT类型存储各种范围的数字,也就是整数。当试图存储超出范围以外的数值将会导致错误。

常用的类型是INTEGER,因为它提供了在范围、存储空间、性能之间的最佳平衡。一般只有取值范围确定不超过SMALLINT的情况下,才会使用SMALLINT类型。而只有在INTEGER的范围不够的时候才使用BIGINT,因为前者相对要快。

除此之外,创建表也可以使用 int2,int4,int8来代表 smallint,integer,bigint。如下示例所示:

1.2任意精度类型和浮点类型

任意精度类型 numeric、decimal可以存储范围大的数字,存储大小为可变大小,小数点前最多131072位数字,小数点后最多16383位。它可以使用类似浮点类型,将小数精确到保留几位,也可以参与计算可以得到准确的值,但是相比于浮点类型,它的计算比较慢。通常 numeric被推荐使用于存储货币金额或其它要求计算准确的值。详细见下表:

名称 描述 存储空间 范围 NUMERIC[(p[,s])],DECIMAL[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。说明: p为总位数,s为小数位数 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 real 可变精度 4个字节 6位小数精度 double precision 可变精度 8个字节 15位小数精度

示例:任意精度类型

1.3 序列类型

SMALLSERIAL,SERIAL和BIGSERIAL类型不是真正的数据类型,只是为在表中设置唯一标识做的概念上的便利。因此,创建一个整数字段,并且把它的缺省数值安排为从一个序列发生器读取。应用了一个NOT NULL约束以确保NULL不会被插入。在大多数情况下用户可能还希望附加一个UNIQUE或PRIMARY KEY约束避免意外地插入重复的数值,但这个不是自动的。最后,将序列发生器从属于那个字段,这样当该字段或表被删除的时候也一并删除它。

名称 描述 存储空间 范围 SMALLSERIAL 二字节序列整型 2字节 1 - 32,767 SERIAL 四字节序列整型 4字节 1 - 2,147,483,647 BIGSERIAL 八字节序列整型 8字节 1 - 9,223,372,036,854,775,807

示例:

通过上述示例,可以知道 smallserial,serial,bigserial相当于先创建一个序列,然后在创建表分别指定不同的整型数据类型smallint,integer,bigint。如下示例:

二 货币数据类型

货币类型存储带有固定小数精度的货币金额。

关于货币数据类型的详细信息如下表:

名称 存储容量 描述 范围 money 8 字节 货币金额 -92233720368547758.08 到 +92233720368547758.07

示例:

这里需要注意的是,如果插入的货币数据类型的金额没有明确指定货币表示符号,那么默认输出本区域货币符号,如上示例所示的20.00输出为$20.00。

如果是人民币,那么如何处理呢?

解决方法有两种,第一种,使用translate函数;第二种,修改本地区域货币符号显示参数。

货币符号作为特殊的数据类型,需要注意计算方式,以防止发生精度丢失的问题。

这种问题解决方式需要将货币类型转换为 numeric 类型以避免精度丢失。

温馨提示:

当一个money类型的值除以另一个money类型的值时,结果是double precision(也就是,一个纯数字,而不是money类型);在运算过程中货币单位相互抵消

三 布尔类型

PostgreSQL提供标准的boolean值,boolean的状态为 true或者false和unknown,如果是unknown状态表示boolean值为null。

名称 描述 存储空间 取值 BOOLEAN 布尔类型 1字节 true:真 false:假 null:未知(unknown

示例:

boolean类型被广泛地使用在业务环境中,例如手机开关机,1表示开机,0表示关机或不在服务区。手机APP登录登出,1表示登录,0表示登出,微信登陆状态,1表示登录成功,0表示登录失败(可能由于网络或者密码错误导致)等等,此处不再一一举例。

四 字符类型

SQL定义了两种主要的字符类型:character varying(n) 和 character(n)。该处的n是一个正数。这两种字符类型都可以存储n(非字节)个长度的字符串。如果存储的字符长度超过了字符类型约束的长度会引起错误,除非多出的字符是空格。

名称 描述 存储空间 CHAR(n)CHARACTER(n) 定长字符串,不足补空格。n是指字符长度,如不带精度n,默认精度为1。 最大为10MB。 VARCHAR(n)CHARACTER VARYING(n) 变长字符串。n是指字符长度。 最大为10MB。 TEXT 变长字符串。 最大为1G-8023B(即1073733621B)。

注意,除了每列的大小限制以外,每个元组的总大小也不可超过1G-8023B(即1073733621B)。

在PostgreSQL中,除了以上的字符数据类型外,还有两种特殊的字符类型如下:

名称 描述 存储空间 name 用于对象名的内部类型。 64字节 “char” 单字节内部类型。 1字节

示例:

温馨提示:

在上面示例中,虽然统计的col1的定长为15的字符存储的字符长度为10个和11个,但是实际上,在存储中col1列占用的长度为15个。并且,在计算长度的时候,空格也被当作一个字符来对待。

五 二进制数据类型

在PostgreSQL中,二进制数据类型有两种,一种为 bytea hex格式,一种为 bytea escape格式。

名称 描述 存储空间 BYTEA 变长的二进制字符串 4字节加上实际的二进制字符串。最大为1G-8203字节。

注意:除了每列的大小限制以外,每个元组的总大小也不可超过1G-8203字节。示例

注意:

实际上bytea多个十六进制值使用E'\xFC' 类似于Oracle中的rawtohex函数。只不过Oracle中的rawtohex函数转换后的值为大写十六进制字符串。实际上如果要在上表中的col2中插入E'\xFG'时,会提示G不是一个有效的十六进制字符。

同时需要注意的是,如果使用E'\xF'只包含单个十六进制字符时,使用一个反斜杠,如果有多个十六进制字符,需要两个反斜杠,如E'\xFE'。

如下:此处的hextoraw函数为我自定义实现的一个UDF函数。

六 日期时间数据类型

PostgreSQL支持丰富的日期时间数据类型如下表:

名称 描述 存储空间 DATE 日期和时间 4字节(实际存储空间大小为8字节) TIME [§] [WITHOUT TIME ZONE] 只用于一日内时间。p表示小数点后的精度,取值范围为0-6。 8字节 TIME [§] [WITH TIME ZONE] 只用于一日内时间,带时区。p表示小数点后的精度,取值范围为0-6。 12字节 TIMESTAMP[§] [WITHOUT TIME ZONE] 日期和时间。p表示小数点后的精度,取值范围为0-6。 8字节 TIMESTAMP[§][WITH TIME ZONE] 日期和时间,带时区。TIMESTAMP的别名为TIMESTAMPTZ。p表示小数点后的精度,取值范围为0-6。 8字节 reltime 相对时间间隔。格式为:X years X mons X days XX:XX:XX。 4字节

6.1日期输入

日期和时间的输入可以是任何合理的格式,包括ISO-8601格式、SQL-兼容格式、传统POSTGRES格式或者其它的形式。系统支持按照日、月、年的顺序自定义日期输入。如果把DateStyle参数设置为MDY就按照“月-日-年”解析,设置为DMY就按照“日-月-年”解析,设置为YMD就按照“年-月-日”解析。

日期的文本输入需要加单引号包围,语法如下:

type [ ( p ) ] 'value'

可选的精度声明中的p是一个整数,表示在秒域中小数部分的位数。

示例:

6.2时间输入

6.3 特殊时间类型

特殊时间类型以reltime表示,表示真实的时间计算值,如100将会使用00:01:40来表示。

示例:

温馨提示:

对于 reltime 时间的输入,需要使用文本类型的输入,也就是说使用单引号引起来。

6.4 其它时间类型

其它时间类型包含时间戳及间隔时间数据类型,示例如下:

示例:

时间数据类型在业务应用中使用非常广泛,如手机APP登录时间,登出时间,金融业务交易时间等等.

七 网络地址类型

PostgreSQL也提供网络地址类型,以用于存储两大IP家族(IPv4 IPv6地址)地址和MAC地址的数据类型。

名称 存储空间 描述 cidr 7或19字节 IPv4或IPv6网络 inet 7或19字节 IPv4或IPv6主机和网络 macaddr 6字节 MAC地址

cidr(无类别域间路由,Classless Inter-Domain Routing)类型,保存一个IPv4或IPv6网络地址。声明网络格式为address/y,address表示IPv4或者IPv6地址,y表示子网掩码的二进制位数。如果省略y,则掩码部分使用已有类别的网络编号系统进行计算,但要求输入的数据已经包括了确定掩码所需的所有字节。

inet类型在一个数据区域内保存主机的IPv4或IPv6地址,以及一个可选子网。主机地址中网络地址的位数表示子网(“子网掩码”)。如果子网掩码是32并且地址是IPv4,则这个值不表示任何子网,只表示一台主机。在IPv6里,地址长度是128位,因此128位表示唯一的主机地址。

该类型的输入格式是address/y,address表示IPv4或者IPv6地址,y是子网掩码的二进制位数。如果省略/y,则子网掩码对IPv4是32,对IPv6是128,所以该值表示只有一台主机。如果该值表示只有一台主机,/y将不会显示。

inet和cidr类型之间的基本区别是inet接受子网掩码,而cidr不接受。

macaddr类型存储MAC地址,也就是以太网卡硬件地址(尽管MAC地址还用于其它用途)。

示例:

八 几何数据类型

PostgreSQL支持集合数据类型,用于存储GIS(地理信息系统)环境中的几何数据,用于地图测绘,城市交通轨迹,地图圈图等场景。

PostgreSQL支持以下几何数据类型:

线(射线)

线段

矩形

路径(包含开放路径【开放路径类似多边形】和闭合路径)

多边形

对于以上几何类型而言,点是其它几何类型的基础。

名称 存储空间 说明 表现形式 point 16字节 平面中的点 (x,y) lseg 32字节 (有限)线段 ((x1,y1),(x2,y2)) box 32字节 矩形 ((x1,y1),(x2,y2)) path 16+16n字节 闭合路径(与多边形类似) ((x1,y1),…) path 16+16n字节 开放路径 [(x1,y1),…] polygon 40+16n字节 多边形(与闭合路径相似) ((x1,y1),…) circle 24字节 圆 <(x,y),r> (圆心和半径)

对于所有的几何数据类型,都是使用二维坐标上面的横坐标和纵坐标来实现的。计算也是在二维坐标中进行的。

示例:

九 JSON数据类型

JSON数据类型可以用来存储JSON(JavaScript Object Notation)数据。数据可以存储为text,但是JSON数据类型更有利于检查每个存储的数值是可用的JSON值。

在 PostgreSQL中,JSON数据类型有两种,原生JSON和JSONB。最主要的区别就是效率不同。JSON 数据类型对于输入文本进行复制,因此在解析时需要进行转换,输入速度块。而JSONB是对输入文本进行分解并以二进制存储,因此在解析时不需要进行转换,处理速度块,但是输入速度相对会慢。除此之外,JSONB数据类型还支持索引。

示例:

温馨提示:

使用jsonb类型,可以使用PL/PYTHON映射为Python中表示的字典,列表等。

十 数组数据类型

ostgreSQL支持数组数据类型,同时支持多维数组。数组最大的优点就是按照数组下标访问,此时下标相当于一个索引,处理速度快。但是同时数组也有劣势,比如在删除或者添加数组元素需要对数组中的元素进行向前或者向后移动,这样导致删除或者添加数组元组时比较慢。

示例:

通过上述示例,可以发现,在PostgreSQL中,虽然声明了数组的长度,但是PostgreSQL对于数组的长度不会做任何限制。

同时访问数组元素从下标1开始,并且在PostgreSQL中并不会出现数组越界异常,如果数组的下标访问超过元素的长度,那么PostgreSQL便会返回一行空值。

以上就是常用数据类型介绍。但是在PostgreSQL中,除了上述数据类型外,还有其它的数据类型,比如XML数据类型,文本搜索数据类型,UUID数据类型,复合数据类型,范围类型,伪类型如any,anyelement,internal等等,在此不做一一介绍。

相关文章