PostgreSQL入门之数据类型(2)

目录

 

7、枚举类型

8、JSON类型

9、网络地址类型

9.1 cidr例子

9.2 macaddr例子

10、位串类型

11、XML类型

12、数组类型

数组的定义

13、复合类型

14、其他类型


7、枚举类型

枚举类型是一个包含静态和值得有序集合的数据类型。

PostgreSQL中的枚举类型类似于C语言中的enum。

需要使用CREATE TYPE命令创建

如下例子

创建星期枚举类型:

CREATE TYPE week AS enum ('Mon','Tue','Wed',

'Thu','Fri','Sat','Sun');

创建表列类型为枚举week

CREATE  TABLE t_week(id serial,create_mood week);

插入数据:由于字段create_mood数据类型为枚举类

型,则字段的值只能为枚举类型week设定的值。

INSERT INTO t_week(create_mood) values('Mon');

如上插入的值为Mon,是枚举中的值,可插入成功。如下,插入的值MMM不是枚举week中的值,则会报错:

INSERT INTO t_week(create_mood) values('MMM');

ERROR:  22P02: invalid input value for enum week: "MMM"

 

8、JSON类型

PostgreSQL支持非结构数据类型json、jsonb。

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

JSON的基础类型有:

JSON 基本类型

PostgreSQL类型

注释

string

text

不允许\u0000,如果数据库编码不是 UTF8,非 ASCII Unicode 转义也是这样

number

numeric

不允许NaN 和 infinity值

boolean

boolean

只接受小写true和false拼写

null

(无)

SQL NULL是一个不同的概念

此外还有相关的函数来处理 json 数据:https://mp.csdn.net/console/editor/html/105371323  ,详情也可翻阅PostgreSQL官方手册。

json与jsonb的区别在于json存储快,而jsonb解析快(原因是json以文本数据存储,jsonb以二进制数据存储)。

示例:

testdb=# create table t_jsons(id serial, name varchar, content  json);

CREATE TABLE

testdb=# insert into t_jsons(name ,content) values('duke','{"sex":"男","age":18}');

INSERT 0 1

testdb=# select * from t_jsons;

 id | name |        content

----+------+-----------------------

  1 | duke | {"sex":"男","age":18}

(1 行记录)

testdb=# select name,content -> 'sex' from t_jsons;

 name | ?column?

------+----------

 duke | "男"

(1 行记录)

显示成文本

testdb=# select name,content ->> 'sex' from t_jsons;

 name | ?column?

------+----------

 duke | 男

(1 行记录)

 

 

9、网络地址类型

PostgreSQL提供用于存储IPv4、IPv6、MAC地址的数据类型。

用这些数据类型存储网络地址比用纯文本类型好,因为这些提供输入错误检查和特殊的操作功能。

名字

存储空间

描述

cidr

7 或 19 字节

IPv4 或 IPv6 网络

inet

7 或 19 字节

IPv4 或 IPv6 主机和网络

macaddr

6 字节

MAC 地址

在对Inet或cidr数据类型进行排序的时候,IPv4地址总是排在IPv6前面。

9.1 cidr例子

cidr输入

cidr输出

abbrev(cidr)

192.168.100.128/25

192.168.100.128/25

192.168.100.128/25

192.168/24

192.168.0.0/24

192.168.0/24

192.168/25

192.168.0.0/25

192.168.0.0/25

192.168.1

192.168.1.0/24

192.168.1/24

192.168

192.168.0.0/24

192.168.0/24

128.1

128.1.0.0/16

128.1/16

128

128.0.0.0/16

128.0/16

128.1.2

128.1.2.0/24

128.1.2/24

10.1.2

10.1.2.0/24

10.1.2/24

10.1

10.1.0.0/16

10.1/16

10

10.0.0.0/8

10/8

10.1.2.3/32

10.1.2.3/32

10.1.2.3/32

2001:4f8:3:ba::/64

2001:4f8:3:ba::/64

2001:4f8:3:ba::/64

2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128

2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128

2001:4f8:3:ba:2e0:81ff:fe22:d1f1

::ffff:1.2.3.0/120

::ffff:1.2.3.0/120

::ffff:1.2.3/120

::ffff:1.2.3.0/128

::ffff:1.2.3.0/128

::ffff:1.2.3.0/128

inet和cidr类型之间的本质区别是inet接受右边有非零位的网络掩码, 而cidr不接受。 例如,192.168.0.1/24对inet来说是有效的, 但是cidr来说是无效的。

9.2 macaddr例子

macaddr类型存储 MAC 地址,也就是以太网卡硬件地址 (尽管 MAC 地址还用于其它用途)。可以接受下列格式的输入:

'08:00:2b:01:02:03'

'08-00-2b-01-02-03'

'08002b:010203'

'08002b-010203'

'0800.2b01.0203'

'0800-2b01-0203'

'08002b010203'

这些例子指定的都是同一个地址。对于位a到f,大小写都可以接受

10、位串类型

位串就是一串 1 和 0 的字符串。它们可以用于存储和直观化位掩码。 我们有两种 SQL 位类型:bit(n) 和bit varying(n), 这里的n是一个正整数。

bit 类型的数据必须准确匹配长度 n, 试图存储短些或者长一些的数据都是错误的。bit varying 类型数据是最长 n 的变长类型;更长的串会被拒绝。 写一个没有长度的bit 等效于 bit(1), 没有长度的 bit varying 意思是没有长度限制。

例子:

testdb=# create  table t_bit(a bit(3),b bit varying);

CREATE TABLE

testdb=# insert into t_bit values(B'101',B'00'),(B'110',B'10010');

INSERT 0 2

testdb=# select  * from t_bit;

  a  |   b

-----+-------

 101 | 00

 110 | 10010

(2 行记录)

 

11、XML类型

xml 数据类型可以用于存储XML数据。 将 XML 数据存到 text 类型中的优势在于它能够为结构良好性来检查输入值, 并且还支持函数对其进行类型安全性检查。 要使用这个数据类型,编译安装时必须使用 configure --with-libxml

xml 可以存储由XML标准定义的格式良好的"文档", 以及由 XML 标准中的 XMLDecl? content 定义的"内容"片段, 大致上,这意味着内容片段可以有多个顶级元素或字符节点。 xmlvalue IS DOCUMENT 表达式可以用来判断一个特定的 xml 值是一个完整的文件还是内容片段。

示例:

SQL标准 :XMLPARSE ( { DOCUMENT | CONTENT } value) 生成XML类型的值

PostgreSQL特有语法 values::xml

 

如:

  1. XMLPARSE ( DOCUMENT '<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_ID" version="3.0">

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

  </welcome-file-list>

</web-app>')

  1. '<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_ID" version="3.0">

     <welcome-file-list>

         <welcome-file>index.html</welcome-file>

          </welcome-file-list>

</web-app>'::xml

 

例子:

create table t_xml(id serial,content xml);

CREATE TABLE

testdb=# insert into t_xml(content) values('<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_ID" version="3.0"> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>'::xml);

INSERT 0 1

testdb=# select * from t_xml;

 id |                                                                                          content

----+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  1 |  <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_ID" version="3.0"> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>

(1 行记录)

 

 

12、数组类型

PostgreSQL允许一个表中的列定义为变长多维数组。可以创建任何内建或用户定义的基类、枚举类型或组合类型的数组。

数组的定义

(1)可以通过在数组元素的数据类型名称后面加上[]来命名,如定义数组元素的数据类型为text的数组:

一维数组:text[]        (不定长)

二维数组:text[][]   (不定长)

当然我们也可以定义定长的数组:

一维数组:text[4]        (定长)

二维数组:text[4][2]      (定长)

  1. 也可以通过一种复合SQL标准语法的关键词ARRAY来定义,如定义数组元素的数据类型为text的数组

一维数组:text  ARRAY[4]  (定长)

二维数组:text  ARRAY[4][2]      (定长)

或者不指定数组长度:

text  ARRAY

示例:

testdb=# create  table t_array(id serial, ary_int int[],ary_text  text  array);  --创建表,ary_int为int型不定长一维数组,ary_text为text型不定长不定维度数组

CREATE TABLE

testdb=# insert into t_array(ary_int,ary_text) values('{1,2,3}','{{"duke","marry"},{"lily","jack"}}');  INSERT 0 1

testdb=# select * from  t_array;

 id | ary_int |          ary_text

----+---------+----------------------------

  1 | {1,2,3} | {{duke,marry},{lily,jack}}

(1 行记录)

testdb=# select ary_int[1],ary_text[1][2] from t_array;

--数组下标从1开始

 ary_int | ary_text

---------+----------

       1 | marry

(1 行记录)

testdb=#

其他的数组操作符及函数可参考:https://blog.csdn.net/qq_39727113/article/details/103194606  更多详情可参考postgreSQL官方手册

 

13、复合类型

复合类型表示一行或者一条记录的结构。它实际上只是一个字段名和它们的数据类型的列表,使用CRREATE TYPE进行定义。PostgreSQL 允许像简单数据类型那样使用复合类型。比如,一个表的某个字段可以声明为一个复合类型。

创建人的符合类型

包括姓名、年龄。

CREATE TYPE person AS(name varchar,age int);

声明表

表字段per使用复合类型person

CREATE TABLE t_persons(id serial,per person);

插入数据

INSERT INTO t_persons(per) values(('marry',18));

查看数据

  test_db=# select * from t_persons;

 id |    per

----+------------

  1 | (marry,18)

(1 行记录)

复合类型数据输入必须使用()括起来。

查看符合类型中某个属性的值

使用(符合类型).属性名,如查询表字段per中属性name的值

test_db=# select (per).name from t_persons;

  name

-------

 marry

(1 行记录)

14、其他类型

PostgreSQL除了支持以上类型外,还支持UUID类型(获取生成UUID的函数时需要创建拓展 uuid-ossp)、范围类型、文本搜索类型等,更多内容请参考PostgreSQL官方文档-数据类型。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Darion@pg

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

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

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

打赏作者

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

抵扣说明:

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

余额充值