PostgreSQL 数据类型

文章目录

  • PostgreSQL数据类型说明
  • PostgreSQL数据类型使用
    • 单引号和双引号
    • 数据类型转换
    • 布尔类型
    • 数值类型
      • 整型
      • 浮点型
      • 序列
      • 数值的常见操作
    • 字符串类型
    • 日期类型
    • 枚举类型
    • IP类型
    • JSON&JSONB类型
    • 复合类型
    • 数组类型

PostgreSQL数据类型说明

PGSQL支持的类型特别丰富,大多数的类型和MySQL都有对应的关系

名称说明对比MySQL
布尔类型boolean,标准的布尔类型,只能存储true,falseMySQL中虽然没有对应的boolean,但是有替换的类型,数值的tinyint类型,和PGSQL的boolean都是占1个字节。
整型smallint(2字节),integer(4字节),bigint(8字节)跟MySQL没啥区别。
浮点型decimal,numeric(和decimal一样一样的,精准浮点型),real(float),double precision(double),money(货币类型)和MySQL基本也没区别,MySQL支持float,double,decimal。MySQL没有这个货币类型。
字符串类型varchar(n)(character varying),char(n)(character),text这里和MySQL基本没区别。 PGSQL存储的varchar类型,可以存储一个G。MySQL好像存储64kb。
日期类型date(年月日),time(时分秒),timestamp(年月日时分秒)(time和timestamp可以设置时区)没啥说的,和MySQL基本没区别。 MySQL有个datetime。
二进制类型bytea-存储二进制类型MySQL也支持,MySQL中是blob
位图类型bit(n)(定长位图),bit varying(n)(可变长度位图)就是存储0,1。MySQL也有,只是这个类型用的不多。
枚举类型enum,跟Java的enum一样MySQL也支持。
几何类型点,直线,线段,圆…………MySQL没有,但是一般开发也用不到
数组类型在类型后,追加[],代表存储数组MySQL没有~~~
JSON类型json(存储JSON数据的文本),jsonb(存储JSON二进制)可以存储JSON,MySQL8.x也支持
ip类型cidr(存储ip地址)MySQL也不支持~

更多数据类型见官网

PostgreSQL数据类型使用

单引号和双引号

在PGSQL中,写SQL语句时,单引号用来标识实际的值。双引号用来标识一个关键字,比如表名,字段名。

-- 单引号写具体的值,双引号类似MySQL的``标记,用来填充关键字
-- 下面的葡萄牙会报错,因为葡萄牙不是关键字
select 1.414,'卡塔尔',"葡萄牙";

数据类型转换

第一种方式:只需要在值的前面,添加上具体的数据类型即可

-- 将字符串转成位图类型
select bit '010101010101001';

第二种方式:也可以在具体值的后面,添加上 ::类型 ,来指定

-- 数据类型
select '2011-11-11'::date;
select '101010101001'::bit(20);
select '13'::int;

第三种方式:使用CAST函数

-- 类型转换的完整写法
select CAST(varchar '100' as int);

布尔类型

布尔类型可以存储三个值,true,false,null。

布尔类型的约束没有那么强,true,false大小写随意,他会给你转,同时yes,no这种他也认识,但是需要转换

select true,false,'yes'::boolean,boolean 'no',True,FaLse,NULL::boolean;

boolean类型在做and和or的逻辑操作时的结果

字段A字段BA and BA or B
truetruetruetrue
truefalsefalsetrue
trueNULLNULLtrue
falsefalsefalsefalse
falseNULLfalseNULL
NULLNULLNULLNULL

数值类型

整型

整型比较简单,主要就是三个:

  • smallint、int2:2字节
  • integer、int、int4:4字节
  • bigint、int8:8字节

一般就用integer,如果要存主键,比如雪花算法,那就bigint。如果要节约空间,根据情况可选smallint。

浮点型

浮点类型就关注2个

  • decimal(n,m):本质就是numeric,PGSQL会帮你转换
  • numeric(n,m):PGSQL本质的浮点类型

针对浮点类型的数据,就使用 numeric

序列

MySQL中的主键自增,是基于auto_increment去实现。MySQL里没有序列的对象。PGSQL和Oracle十分相似,支持序列:sequence。序列的正常构建方式:

create sequence erdan.table_id_seq;
-- 查询下一个值
select nextval('erdan.table_id_seq');
-- 查询当前值
select currval('erdan.table_id_seq');

序列大多数的应用,是用作表的主键自增效果。

-- 表自增
create table erdan.xxx(id int8 default nextval('erdan.table_id_seq'),name varchar(16)
);
insert into erdan.xxx (name) values ('xxx');
select * from erdan.xxx;

PGSQL提供了序列的数据类型,可以在声明表结构时,直接指定序列的类型即可。

  • smallserial
  • serial
  • bigserial
-- 表自增(爽)
create table erdan.yyy(id bigserial,   name varchar(16)
);
insert into erdan.yyy (name) values ('yyy');

在drop表之后,序列不会被删除,但是序列会变为不可用的状态。因为序列在使用serial去构建时,会绑定到指定表的指定列上。如果是单独构建序列,再构建表,使用传统方式实现,序列和表就是相对独立的。

数值的常见操作

针对数值下面实现加减乘除取余这5个操作

操作符描述示例结果
^2 ^ 38
|/平方根|/ 366
@绝对值@ -55
&31 & 1616
|31|3263
<<左移1<<12
>>右移16>>18

数值操作也提供了一些函数,比如pi(),round(数值,位数),floor(),ceil()

字符串类型

字符串类型用的是最多的一种,在PGSQL里,主要支持三种:

  • character(就是MySQL的char类型),定长字符串。(最大可以存储1G)
  • character varying(varchar),可变长度的字符串。(最大可以存储1G)
  • text(跟MySQL异常)长度特别长的字符串。

操作可以查看官方说明

日期类型

在PGSQL中,核心的时间类就三个。

  • timestamp(时间戳,覆盖 年月日时分秒)
  • date(年月日)
  • time(时分秒)

在PGSQL中,声明时间只需要使用字符串正常的编写 yyyy-MM-dd HH:mm:ss 使用数据转换方式就可以转换为时间类型。

当前系统时间

  • 可以使用now作为当前系统时间(没有时区的概念)
  select timestamp 'now';-- 直接查询now,没有时区的概念select time with time zone 'now' at time zone '08:00:00'
  • 也可以使用current_timestamp的方式获取(推荐,默认东八区)

日期类型的运算:

  • 正常对date类型做+,-操作,默认单位就是天~
  • date + time = timestamp~~~
  select date '2011-11-11' + time '12:12:12' ;
  • 可以针对timestamp使用interval的方式进行 +,-操作,在查询以时间范围为条件的内容时,可以使用
  select timestamp '2011-11-11 12:12:12' + interval '1day' + interval '1minute' + interval '1month';

枚举类型

枚举类型MySQL也支持,只是没怎么用,PGSQL同样支持这种数据类型。声明枚举类型作为表中的字段类型,这样可以无形的给表字段追加规范。

-- 声明一个星期的枚举,值自然只有周一~周日。
create type week as enum ('Mon','Tues','Sun');
-- 声明一张表,表中的某个字段的类型是上面声明的枚举。
drop table test;
create table test(id bigserial ,weekday week
);
insert into test (weekday) values ('Mon');
insert into test (weekday) values ('Fri');

image.png

IP类型

PGSQL支持IP类型的存储,支持IPv4,IPv6这种,甚至Mac那种诡异类型也支持。这种IP类型,可以在存储IP时,帮助做校验,其次也可以针对IP做范围查找。IP校验的效果如下:

image.png

IP也支持范围查找:

image.png

JSON&JSONB类型

JSON在MySQL8.x中也做了支持,但是MySQL支持的不好,因为JSON类型做查询时,基本无法给JSON字段做索引。PGSQL支持JSON类型以及JSONB类型,两者使用基本没区别。

JSON和JSONB的区别:

  • JSON类型无法构建索引,JSONB类型可以创建索引。
  • JSON类型的数据中多余的空格会被存储下来。JSONB会自动取消多余的空格。
  • JSON类型甚至可以存储重复的key,以最后一个为准。JSONB不会保留多余的重复key(保留最后一个)。
  • JSON会保留存储时key的顺序,JSONB不会保留原有顺序。

JSON中key对应的value的数据类型

JSONPGSQL
Stringtext
numbernumeric
booleanboolean
null(none)
[{"name": "张三"},{"name": {"info": "xxx"}}]

操作JSON:

  • 上述的四种JSON存储的类型:
  select '9'::JSON,'null'::JSON,'"erdan"'::JSON,'true'::json;select '9'::JSONB,'null'::JSONB,'"erdan"'::JSONB,'true'::JSONB;
  • JSON数组
  select '[9,true,null,"我是字符串"]'::JSON;
  • JSON对象image.png
  select '{"name": "张三","age": 23,"birthday": "2011-11-11","gender": null}'::json;select '{"name": "张三","age": 23,"birthday": "2011-11-11","gender": null}'::jsonb;
  • 构建表存储JSON
  create table test(id bigserial,info json,infob jsonb);insert intotest(info,infob)   values ('{"name":            "张三"              ,"age": 23,"birthday": "2011-11-11","gender": null}','{"name":               "张三"             ,"age": 23,"birthday": "2011-11-11","gender": null}')select * from test;
  • 构建索引的效果image.png
  create index json_index on test(info);create index jsonb_index on test(infob);

JSON还支持很多函数,可以直接查看官方

复合类型

复合类型就好像Java中的一个对象,Java中有一个User,User和表做了一个映射,User中有个人信息对象。可以基于符合类型对映射上个人信息。

public class User{private Integer id;private Info info;
}class Info{private String name;private Integer age;
}

按照上面的情况,将Info构建成一个复合类型

-- 构建复合类型,映射上Info
create type info_type as (name varchar(32),age int);
-- 构建表,映射User
create table tb_user(id serial,info info_type
);
-- 添加数据
insert into tb_user (info) values (('张三',23));
insert into tb_user (info) values (('露丝',233));
insert into tb_user (info) values (('jack',33));
insert into tb_user (info) values (('李四',24));
select * from tb_user;

数组类型

PGSQL中,指定数组的方式就是[],可以指定一维数组,也支持二维甚至更多维数组。构建数组的方式:

drop table test;
create table test(id serial,col1 int[],col2 int[2],col3 int[][]
);
-- 构建表指定数组长度后,并不是说数组内容只有2的长度,可以插入更多数据
-- 甚至在你插入数据,如果将二维数组结构的数组扔到一维数组上,也可以存储。
-- 数组编写方式
select '{{how,are},{are,you}}'::varchar[];
select array[[1,2],[3,4]];
insert into test (col1,col2,col3) values ('{1,2,3}','{4,5,6}','{7,8,9}');
insert into test (col1,col2,col3) values ('{1,2,3}','{4,5,6}',array[[1,2],[3,4]]);
insert into test (col1,col2,col3) values ('{1,2,3}','{4,5,6}','{{1,2},{3,4}}');
select * from test;

如果现在要存储字符串数组,如果存储的数组中有双引号怎么办,有大括号怎么办。

-- 如果存储的数组中的值,有单引号怎么办?
-- 使用两个单引号,作为一个单引号使用
select '{''how''}'::varchar[];
-- 如果存储的数组中的值,有逗号怎么办?(PGSQL中的数组索引从1开始算,写0也是从1开始算。)
-- 用双引号将数组的数据包起来~
select ('{"how,are"}'::varchar[])[2];
-- 如果存储的数组中的值,有双引号怎么办?
-- 如果要添加双引号,记得转义。
select ('{"\"how\",are"}'::varchar[])[1];

数组的比较方式

-- 包含
select array[1,2] @> array[1];
-- 被包含
select array[1,2] <@ array[1,2,4];
-- 是否有相同元素
select array[2,4,4,45,1] && array[1];

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/132067.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无涯教程-JavaScript - ISREF函数

描述 如果指定的值是参考,则ISREF函数返回逻辑值TRUE。否则返回FALSE。 语法 ISREF (value) 争论 Argument描述Required/OptionalvalueA reference to a cell.Required Notes 您可以在执行任何操作之前使用此功能测试单元格的内容。 适用性 Excel 2007,Excel 2010,Exce…

算法——快乐数

202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 由图可知&#xff0c;其实这也是一个判断循环的过程&#xff0c;要用到快慢指针&#xff0c;且相遇后&#xff0c;若在全为1的循环里&#xff0c;那么就是快乐数&#xff0c;若相遇后不为1&#xff0c;说明这不是快乐数。 …

反常积分的概念与计算

目录 无穷区间上的反常积分 无界函数的反常积分 反常积分的敛散性 反常积分的计算 无穷区间上的反常积分 无穷区间上的反常积分(improper integral on infinite interval)是一种反常积分 设函数f(x)在(a,∞)上有定义&#xff0c;且f(x)在任意有限区间(a,A)(A>a)上可积&…

AI项目五:结印动作识别

若该文为原创文章&#xff0c;转载请注明原文出处。 感谢恩培大佬对项目进行了完整的实现&#xff0c;并将代码进行开源&#xff0c;供大家交流学习。 恩培大佬开源地址&#xff0c;有兴趣的可以去复现一下。GitHub - enpeizhao/CVprojects: computer vision projects | 计算机…

Android Glide in RecyclerView,only load visible item when page return,Kotlin

Android Glide in RecyclerView&#xff0c;only load visible item when page return&#xff0c;Kotlin base on this article&#xff1a; Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片&#xff0c;Kotlin_zhangphil的博客…

使用大型语言模型的指南: 提高效率及安全性的技巧和策略 | 开源日报 0913

brexhq/prompt-engineering Stars: 5.8k License: MIT Prompt Engineering Guide&#xff0c;提供了与大型语言模型&#xff08;LLM&#xff09;相关的技巧和窍门。该指南基于Brex公司在生产用例中研究和创建LLM提示时所学到的经验教训&#xff0c;并涵盖了有关使用和构建程序…

【Java从入门到精通】这也许就是Java火热的原因吧!

前言&#xff1a;Java是一种高级的、面向对象的、可跨平台的程序设计语言。Java根据技术类别可划分为以下几类&#xff1a;JavaSE&#xff08;Standard Edition&#xff0c;标准版&#xff09;&#xff1a;支持面向桌面、嵌入式和移动设备的应用程序开发&#xff1b;JavaEE&…

机器学习实战-系列教程7:SVM分类实战2线性SVM(鸢尾花数据集/软间隔/线性SVM/非线性SVM/scikit-learn框架)项目实战、代码解读

&#x1f308;&#x1f308;&#x1f308;机器学习 实战系列 总目录 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 SVM分类实战1之简单SVM分类 SVM分类实战2线性SVM SVM分类实战3非线性SVM 3、不同软间隔C值 3.1 数据标准化的影响 如图左边是没…

目录操作函数

1.mkdir #include <sys/stat.h> #include <sys/types.h> int mkdir(const char *pathname, mode_t mode); 作用&#xff1a;创建一个目录 参数&#xff1a; -pathname:创建的目录的路径 -mode:权限&#xff0c;八进制的数 返回值&#xff1a; 成功返回0&#xff…

activemq学习笔记

传统的request/response 在客户端提交请求后必须等待服务端处理完毕给于反馈&#xff0c;这期间客户端完全处于空闲等待状态&#xff0c;甚至有可能超时&#xff1b; 基于消息中间件的request/response 客户端提交请求&#xff0c;不必等待服务器处理&#xff0c;客户端可以继…

Re-Learn Linux Part1

1. Linux的目录结构 在Linux文件系统中有两个特殊的目录&#xff1a; 一个用户所在的工作目录&#xff0c;也叫当前目录&#xff0c;可以使用一个点 . 来表示&#xff1b;另一个是当前目录的上一级目录&#xff0c;也叫父目录&#xff0c;可以使用两个点 .. 来表示。 . &#…

Kubernetes网络插件Canal的工作原理和关键功能

文章目录 什么是 Canal&#xff1f;安装 Canal配置网络策略使用 Canal 进行跨节点通信总结 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;云计算 ✨文章内容&#xff1a;网…

Direct3D光照

光照的组成 环境光&#xff1a;这种类型的光经其他表面反射到达物体表面&#xff0c;并照亮整个场景&#xff0c;要想以较低代价粗略模拟这类反射光&#xff0c;环境光是一个很好的选择 漫射光&#xff1a;这种类型光沿着特定的方向传播。当它到达某一表面时&#xff0c;将沿…

Python 内置函数详解 (2) 逻辑运算

近期在外旅游,本篇是出发编辑的,准备定时发布用,不完整,旅游回来后再补充。 Python 内置函数 Python3.11共有75个内置函数,其来历和分类请参考:Python 新版本有75个内置函数,你不会不知道吧_Hann Yang的博客-CSDN博客https://blog.csdn.net/boysoft2002/article/detai…

群晖Cloud Sync数据同步到百度云、另一台群晖、nextcloud教程

群晖Cloud Sync数据同步到百度云、另一台群晖、nextcloud教程 一、群晖套件中下载Cloud Sync 二、同步到百度云盘 打开Cloud Sync&#xff0c;点击左上角的号&#xff0c;云供应商选择百度云。 这里可以选择双向备份&#xff0c;也可以只上穿到百度云的仅上传本地更改。因为百…

服务器中了勒索病毒怎么办?勒索病毒解密,数据恢复

勒索病毒是一种比较常见的电脑病毒&#xff0c;它们给企业的生产经营和发展带来了很大的影响。可是绝大多数企业在这方面并没有做合理的预案&#xff0c;这也导致当安全运维人员或者企业主发现中了勒索病毒以后手足无措。那云天数据恢复中心就用这篇文章来告诉大家当服务器中了…

联通数科赋能中国联通DCMM5级评估!

近日&#xff0c;中国电子信息行业联合会发布了“关于公布获得数据管理能力成熟度等级证书单位的通知”&#xff0c;中国联通获得最高等级优化级&#xff08;5级&#xff09;&#xff0c;成为通信行业率先获得最高等级的单位&#xff0c;标志着中国联通数据管理能力进入国家第一…

MyBatis基础之概念简介

文章目录 基本概念1. 关于 MyBatis2. MyBatis 的体系结构3. 使用 XML 构建 SqlSessionFactory4. SqlSession5. 默认的别名6. 补充 [注意] 放前面前 很多人可能在使用 MyBatis-plus 进行代码开发&#xff0c;MyBatis的这部分内容是用来更好的讲述之后的内容。 基本概念 1. 关于…

Apollo介绍和入门

文章目录 Apollo介绍配置中心介绍apollo介绍主流配置中心功能特性对比 Apollo简介 入门简单的执行流程Apollo具体的执行流程Apollo对象执行流程分步执行流程 核心概念应用&#xff0c;环境&#xff0c;集群&#xff0c;命名空间企业部署方案灰度发布全量发布 配置发布的原理发送…

小程序引入高德/百度地图坐标系详解

小程序引入高德/百度地图坐标系详解 官网最近更新时间&#xff1a;最后更新时间: 2021年08月17日 高德官网之在原生小程序中使用的常见问题 链接 目前在小程序中使用 高德地图只支持以下功能 &#xff1a;地址描述、POI和实时天气数据 小结&#xff1a;从高德api中获取数…