百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

一文看懂PG数据类型介绍及数据类型转换

toyiye 2024-06-21 12:23 12 浏览 0 评论

概述

续上次的PG数据类型介绍,下面的类型相对比较少见,不过建议还是要做一下了解。


一、JSON/JSONB类型

postgresql不只是关系型数据库,同时还支持非关系数据类型json。 json属于重量级的非常规数据类型。

1、列表

JSON数据类型可以用来存储JSON(JavaScript对象符号)数据。这样的数据也可以被存储为文本,但json数据类型具有的优点是检查每个存储的值是否为有效的JSON值。也有相关的支持功能可以直接用来处理JSON数据类型,如下所示:

2、简单应用

--1.创建
CREATE TABLE test_json1(
	id serial PRIMARY key,
	name json
);
--2.插入数据
INSERT INTO test_json1(name) VALUES ('{"col1":1,"col2":"jack","col3":"male"}');
--3.查询
SELECT * FROM test_json1;
--4. 通过 "->"操作符可以查询json数据的键值
SELECT name -> 'col2' AS name FROM test_json1 WHERE id = 1;
--5.如果以文本格式返回json字段键值可以使用 "->>"操作符
SELECT name ->> 'col2' FROM test_json1 WHERE id = 1;

3、jsonb 与json差异

json存储格式为文本而jsonb存储为二进制。json类型以文本存储并储存的内容和输入数据一样,当检索json数据时必须重新解析,而jsonb以二进制形式存储已解析好的数据。当检索jsonb数据时不需要重新解析,因此json写入比jsonb快,但检索比jsonb慢。

json保证输入和输出顺序,jsonb不保证加粗样式

jsonb类型会去掉输入数据中键值的空格,另外会删除重复的键,仅保留最后一个。

--1.删除json数据的键/值。
SELECT '{"a":1,"b":2}'::jsonb - 'a';

--jsonb与json函数
--扩展最外层的json对象称为一组 键/值得结果集。
SELECT * FROM json_each('{"a":"foo","b":"bar"}');
/*
key	value
a	"foo"
b	"bar"
*/

--以文本格式返回
SELECT * FROM json_each_text('{"a":"foo","b":"bar"}');
/*
key	value
a	foo
b	bar
*/

--row_to_json()函数
-- 能够将行作为json对象返回,此函数常用来生成json测试数据。
-- 比如将普通表转换成json类型表。
create TABLE test_copy(
	id int4,
	name varchar(20)
);
INSERT INTO test_copy(id,name) VALUES(1,'a'),(2,'b');

-- 将普通表转成json类型表
SELECT row_to_json(test_copy) FROM test_copy;
/**
row_to_json
{"id":1,"name":"a"}
{"id":2,"name":"b"}
*/

-- 返回最外层的json对象中的键的集合
SELECT * FROM json_object_keys('{"a":"foo","b":"bar"}');
/*
json_object_keys
a
b
*/

-- jsonb 键/值的追加、删除、更新
-- jsonb 追加 通过 "||"操作符
SELECT '{"name":"jack","age":"31"}'::jsonb || '{"sex":"male"}'::jsonb;
-- {"age": "31", "sex": "male", "name": "jack"}

-- json 键/值删除有两种方式 : "-" 和 "#-"
SELECT '{"age": "31", "sex": "male", "name": "jack"}' ::jsonb - 'sex';
-- {"age": "31", "name": "jack"}

-- 第二种:"#-" 通常用于嵌套json数据删除的场景
SELECT '{"name":"meki","contact":{"phone":"1234","fax":"0101"}}'::jsonb #- '{contact,fax}'::text[];
-- {"name": "meki", "contact": {"phone": "1234"}}

-- 键值更新:一种方式通过 "||" ;另外一种是 jsonb_set
SELECT '{"name":"frank","age":"11"}'::jsonb || '{"age":"12"}'::jsonb;
-- {"age": "12", "name": "frank"}

--jsonb_set(target jsonb,path text[],new_value [,create_missing booean)
-- create_missing值为false表示如果键不存在则不添加
SELECT jsonb_set('{"name":"frank","age":"11"}'::jsonb,'{sex}','"male"'::jsonb,true);
-- {"age": "11", "sex": "male", "name": "frank"}

二、复合类型

此类型代表一个字段名和数据类型,即结构的一个表中的行或记录列表。

1、复合类型声明

下面的例子演示如何声明一个复合类型:

CREATE TYPE inventory_item AS (
 name text,
 supplier_id integer,
 price numeric
); 
此数据类型可用于在创建表如下所示:
CREATE TABLE on_hand (
 item inventory_item,
 count integer
); 

2、复合值输入

复合值可以插入文字常量,封装领域括号内的值,并用逗号将它们隔开。

INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000); 

此有效的定义同上的inventory_item的。行关键字实际上是可选的表达式中,只要有一个以上的字段。

3、访问复合类型

要访问一个复合列的字段,字段名,使用点很像选择字段从一个表名。例如,要选择一些子字段,on_hand示例表的查询如下:

SELECT (item).name FROM on_hand WHERE (item).price > 9.99; 
--甚至可以使用表名(例如,在一个多表查询),像这样:
SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99; 

三、其他类型

1、货币类型

货币类型存储的货币金额与一个固定的分数精度。可以转换为金钱的数字,int和bigint数据类型的值。不推荐使用浮点数来处理金钱的潜力,由于舍入误差。

2、二进制数据类型

bytea数据类型允许存储二进制字符串,如下面的表格中说明。

3、布尔类型

PostgreSQL提供了标准的SQL类型布尔值。布尔类型可以有几种状态:true,false,和第三状态null,这是SQL空值表示。

4、枚举类型

枚举(枚举)类型的数据类型,包括静态,有序设置的值。在许多编程语言支持枚举类型,它们是相等。

Unlike other types, Enumerated Types need to be created using CREATE TYPE command. This type is used to store a static, ordered set of values, for example compass directions, i.e. NORTH, SOUTH, EAST, and WEST or days of the week as below:

枚举一旦产生,它们可以像任何其他类型。

5、几何类型

几何数据类型表示二维空间对象。最根本的不同点是形成的所有其他类型的基础。

6、网络地址类型

PostgreSQL提供的数据类型来存储的IPv4,IPv6的地址和MAC地址。这是更好地使用这些类型,而不是纯文本类型存储网络地址,因为这些类型提供输入错误检查和特殊的操作和函数。

7、位串类型

位串类型用于存储位掩码。他们要么是0或1。 SQL位类型有两种:(n)的位而变位(n)的,其中n是一个正整数

8、文本搜索类型

这个类型支持全文检索,这是通过自然语言文档的集合的搜索,找到那些最符合查询活动。这有两种数据类型:

9、UUID类型

一个UUID(通用唯一标识符)写成小写的十六进制数字序列,由连字号,特别是一组8位数字,然后由三组4位数字,然后由一组12位数字分开几组,总32位,128位代表。

一个UUID的例子是: 550e8400-e29b-41d4-a716-446655440000

10、XML Type

xml数据类型可以用来存储XML数据。对于存储XML数据,首先创建XML值函数XMLPARSE如下:

XMLPARSE (DOCUMENT '

PostgreSQL Tutorial 
 ...
')

XMLPARSE (CONTENT 'xyzbarfoo') 

11、范围类型

范围类型的数据类型,采用了一系列数据。范围类型可以是离散的范围(例如,所有的整数值1到10)或连续范围(例如任何时间点的上午10:00到上午11:00)。

内置的范围类型范围包括:

  • int4range - Range of integer
  • int8range - Range of bigint
  • numrange - Range of numeric
  • tsrange - Range of timestamp without time zone
  • tstzrange - Range of timestamp with time zone
  • daterange - Range of date

可以创建自定义的范围类型,做出新的类型的适用范围,如使用int类型为基础的IP地址范围,或者使用浮点数据类型为基础的浮动范围。

范围类型支持包容性和排他性的范围边界分别使用[]和()个字符,例如: [4,9]'代表所有从包括4但不包括9的整数。

12、对象标识符类型

对象标识符(OID)内部使用PostgreSQL作为各种系统表的主键。 OIDS IfWITH指定或default_with_oids配置变量,只有在这样的情况下启用的OID被添加到用户创建的表。下表列出了几个别名类型。 OID别名类型有没有自己的操作,除了专门的输入和输出过程。

13、伪类型

PostgreSQL类型系统包含了一些特殊用途的统称为伪类型的项。一个伪类型不能被用作列的数据类型,但它可以用来声明一个函数的参数或结果类型。下表列出了现有的伪类型。


四、数据类型转换

postgresql数据类型转换主要有三种方式:

  • 通过格式化函数
  • CAST函数
  • ::操作符

1、格式化函数

2、通过CAST函数进行转换

3、通过 ::操作符进行转换


觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

相关推荐

如何利用Xpath抓取京东网商品信息

前几小编分别利用Python正则表达式和BeautifulSoup爬取了京东网商品信息,今天小编利用Xpath来为大家演示一下如何实现京东商品信息的精准匹配~~HTML文件其实就是由一组尖括号构成的标...

如何利用Xpath选择器抓取京东网商品信息

前几小编分别利用Python正则表达式和BeautifulSoup爬取了京东网商品信息,今天小编利用Xpath来为大家演示一下如何实现京东商品信息的精准匹配~~HTML文件其实就是由一组尖括号构成的标...

python之Scrapy爬虫案例:豆瓣(python爬虫书籍豆瓣评分)

python模块之Scrapy爬虫框架...

Python编程入门学习:最常见加密方式和Python实现

前言我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes。所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错。将字符串...

一日一技:Python中的string.rindex()方法

string.rindex()方法string.rindex()方法返回字符串内子字符串的最高索引(如果找到)。如果未找到子字符串,则会引发异常。rindex()的语法为:...

Asterisk-ARI对通道中的DTMF事件处理

Asterisk通道中关于DTMF处理是一个非常重要的功能。通过DTMF可以实现很多的业务处理。现在我们介绍一下关于ARI对通道中的DTMF处理,我们通过自动话务员实例来说明Asterisk如何创建一...

PyQt5 初次使用(pyqt5下载官网)

本篇文章默认已安装Python3,本篇文章默认使用虚拟环境。安装pipinstallPyQt5PyQt一些图形界面开发工具QtDesigner、国际化翻译工具Liguist需要另外...

Qt开发,使用Qt for Python还是Qt C++ Qt开发,使用Qt for

Qt开发使用QtforPython还是QtC++?1.早些年写过一个PyQt5的项目,最近几年重构成QtC++了,其中有个人原因,如早期代码写得烂,...

最简单方法!!用python生成动态条形图

最近非常流行动态条形图,在B站等视频网站上,此类视频经常会有上百万的播放量,今天我们通过第三方库:bar_chart_race(0.2版本)来实现动态条形图的生成;生成的效果如图:问题:...

Asterisk通道和ARI接口的通信(aau通道数)

Asterisk通道和ARI详解什么是通道Asterisk中,通道是介于终端和Asterisk自己本身的一个通信媒介。它包含了所有相关信息传递到终端,或者从终端传递到Asterisk服务器端。这些信...

Python GUI-长链转短链(长链接转化成短链接java)

当我们要分享某一个链接给别人,或是要把某个链接放入帖子中时,如果链接太长,则会占用大量空间,而且很不美观。这时候,我们可以结束长链转短链工具进行转换。当然可以直接搜索在线的网站进行转换,但我们可以借此...

Python 的hash 函数(python的hash函数)

今天在看python的hash函数源码的时候,发现针对不同的数据类型python实现了不同的hash函数,今天简单介绍源码中提到的hash函数。(https://github.com/pyth...

8款Python GUI开源框架,谁才是你的菜?

作为Python开发者,你迟早都会用到图形用户界面来开发应用。本文千锋武汉Python培训小编将推荐一些PythonGUI框架,希望对你有所帮助。1、Python的UI开发工具包Kivy...

python适合开发桌面软件吗?(python可不可以开发桌面应用软件)

其实Python/Java/PHP都不适合用来做桌面开发,Java还是有几个比较成熟的产品的,比如大名鼎鼎的Java集成开发环境IntelliJIDEA、Eclipse就是用Java开发的,不过PH...

CryptoChat:一款功能强大的纯Python消息加密安全传输工具

关于CryptoChatCryptoChat是一款功能强大的纯Python消息加密安全传输工具,该工具专为安全研究专家、渗透测试人员和红蓝队专家设计,该工具可以完全保证数据传输中的隐私安全。该工具建立...

取消回复欢迎 发表评论:

请填写验证码