PostgreSQL 初探

PostgreSQL 是我们经常选择的数据库之一。它不仅仅是关系型数据库,同时也添加了对JSON数据的支持全文检索功能,以及其他扩展。

2020 年 2月的总排名为第四名,关系型数据库中排名第四名。排名信息参考:DB-Engines

为了更好地应用的工作中,针对 PostgreSQL 给我造成的疑惑整理了如下内容:

(1) PostgreSQL 版本之间的主要区别
(2) PostgreSQL 支持的数据类型
(3) PostgreSQL 存储引擎Heap介绍
(4) 围绕 JSON/JSONB 的全文检索功能以及 12.x 中的 JSON/JSONB Path

1, PostgreSQL 版本之间的主要区别

2020 年 2 月当我们访问 PostgreSQL 官网的时候,通过看到多个 Release 版本,应该怎么选择呢?

PostgreSQL 9.x 版本在 2020 年 2 月的版本是计划中的左右一个 release 版本,所以翻阅了 PostgreSQL 的相关文档后,整理了从 10.X,11.X,12.X 这三个版本的信息。如下图:

通过上面的版本我们发现,给开发人员带来的变化不大,这里列出了 4 项,开发人员经常关注的技术点:

(1)当前支持的数据类型
(2)存储引擎 Heap 具体的特性
(3)围绕 JSON/JSONB 的全文检索功能以及 12.x 中的 JSON/JSONB Path

所以下文将主要研究上面是 4 个技术点。

这里使用了一个 12.2 版本的 PostgreSQL 的 Docker 镜像:

 docker pull postgre:12.2

如果对其他版本感兴趣可以访问[Docker hub](https://hub.docker.com/_/postgres?tab=tags) 启动 Postgre

docker run -e POSTGRES_PASSWORD=123456 -p 5432:5432 --name potgre12 postgres:12.2

其中的 -e POSTGRES_PASSWORD=123456 是设置 superuser 用户的密码,superuser 的默认 username 是 postgres.

PS:如果不想通过密码访问也可以通过 POSTGRES_HOST_AUTH_METHOD=trust 来允许不需要密码访问。

安装 psql 客户端(如果你还是用其他客户端可以跳过该步骤)

brew install libpq

连接 postgreSQL

psql -h 127.0.0.1 -p 5432 -U postgres --passsword

2,PostgreSQL 支持数据类型

PostgreSQL 中支持多种数据类型。如下图

3,PostgreSQL 存储引擎 Heap 具体特性

PostgreSQL 的存储引擎 Heap 和 MySQL 的 InnoDB 都完全遵循ACID,使用的是行级锁。

4,围绕 JSON/JSONB 的全文检索功能以及 12.x 中的 JSON/JSONB Path

JSON 和 JSONB 的区别在于:

(1) JSON 类型以 JSON 格式存储文本数据,在查询的时候需要先做内容解析,然后进行查询。所以写入快、查询慢。

(2)JSONB 类型以 JSON 格式的二进制形式存储数据,在插入的时候需要做文本解析,查询的时候并不需要做解析,因此写入慢,查询快。

而对 JSON/JSONB 涉及到内容包括,下面的内容对对一条数据的一个简单例子:建表、新建数据、查询、模糊查询、数据更新。

(1)建表

create table boy (id int primary key not null, name char(30) not null, information jsonb
);

(2)新建数据

insert into boy (id, name, information) values (1,'Page', '{"age":18}');
insert into boy (id, name, information) values (2,'Aaron', '{"age":18}');
insert into boy (id, name, information) values (3,'Join', '{"age":18, "address":"beijing dongchengqu"}');

(3)查询

# 从 9.4 版本只是的通过 操作符 来查询 age 等于 18 的 studentselect * from boy where (information->>'age')::int=18;# 从 9.4 版本只是的通过 操作符 来查询 address 中以 beijing 开头的 studentsselect * from boy where (information->>'address')::text like 'beijing%';# 12.x版本支持的 JSON/JSONB Path 方式查询 age 等于 18 的 studentselect jsonb_path_query(information, '$.age ? (@==18)') from boy;# 12.x版本支持的 JSON/JSONB Path 方式查询 address 中以 beijing 开头的 studentsselect jsonb_path_query(information, '$.address ? (@ starts with "beijing")') from boy;

通过上面的代码不难发现,PostgreSQL 12 中提供的 JSON function 非常好用。更多查询语句可以参考: 官网 json functions

(4)模糊查询(全文检索)

经过尝试默认条件下 PostgreSQL 提供的分词器对中文分词并不好。所以下面将演示英文的全文检索

新建表

create table technical (id int primary key not null,name tsvector
);

其中 tsvector 的数据类型是是分词器类型。可以执行 select 'hello page'::tsvector; 来查看分词结果。

插入数据

insert into technical (id, name) values (1, 'Test Driven Development'), (2, 'Test Driven Design'), (3, 'Behave Driven Development');

当搜索关键词 Test和Driven 时应该是显示 2 条结果;

select * from technical where name@@'Test & Driven';

总结:

通过上面的几个特性的分析,不难发现 PostgreSQL 提供了强大的功能和函数,上手之前还是需要对其中的函数有个大致的了解。

参考

(1) PostgreSQL 中文网

java执行查询postgresql得到中文乱码_PostgreSQL 初探相关推荐

  1. java执行查询postgresql得到中文乱码_Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(上篇)...

    关于作者 姚延栋,山东大学本科,中科院软件所研究生.PostgreSQL中文社区委员,致力于Greenplum/PostgreSQL开源数据库产品.社区和生态的发展. 一.数据库内核揭秘 Greenp ...

  2. java执行查询postgresql得到中文乱码_比这个夏天还要热的PostgreSQL数据库来啦!

    什么是PostgreSQL? 云数据库 PostgreSQL 是京东云基于开源的 PostgreSQL 10.6 版本构建的一款功能强大的企业级关系型数据库管理系统. PostgreSQL有" ...

  3. linux下java程序乱码,解决linux下java程序(例如applet)中文乱码问题

    解决linux下java程序(例如applet)中文乱码问题 平台:Mandriva 2006.0 将Windows下的字体文件simsun.ttc拷贝到/usr/share/fonts/zh_CN, ...

  4. java解决properties中中文乱码问题

    Java解决properties中中文乱码的问题 Properties文件介绍 与Properties文件的前世今生 native2ascii.exe的使用 首先编写配置文件 实验 修改测试代码进行更 ...

  5. java 插入 mysql 乱码_解决java中插入mysql中文乱码的方法

    解决java中插入mysql中文乱码的方法 发布时间:2020-07-11 14:35:11 来源:亿速云 阅读:100 作者:清晨 这篇文章主要介绍解决java中插入mysql中文乱码的方法,文中介 ...

  6. Java URL传参中文乱码问题

    2019独角兽企业重金招聘Python工程师标准>>> 我们经常会遇到这样的场景:在URL中传递参数,如果该参数为中文,如果设置不当,会出现乱码问题. URL传参所使用的编码为服务器 ...

  7. java压缩zip文件中文乱码问题

    --转自:http://riching.iteye.com/blog/579634 用java来打包文件生成压缩文件,有两个地方会出现乱码 1.内容的中文乱码问题,这个问题网上很多人给出了解决方法,两 ...

  8. 关于java.util.Properties读取中文乱码的正确解决方案(不要再用native2ascii.exe了)...

    从Spring框架流行后,几乎根本不用自己写解析配置文件的代码了, 但近日一个基础项目(实在是太基础,不能用硕大繁琐的Spring), 碰到了用java.util.Properties读取中文内容(U ...

  9. java 页面编码_java中文乱码解决之道(七)-----JSP页面编码过程

    我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. 在上面代码中有两个地方存在编码:pageEncodi ...

最新文章

  1. SysAid 9.0 发布,增加移动设备管理功能
  2. ubuntu部署postgreSQL数据库
  3. ai去除水印_ai全自动视频剪辑软件,每天批量制作800条原创视频!
  4. 深入浅出requireJS-1
  5. 解析http头部和c++string的高级使用技巧
  6. 查看linux上卸载mysql数据库_linux卸载mysql数据库
  7. 【python学习-2】python起步必备
  8. 几个北大和南开学霸公众号,值得学习
  9. 王源就抽烟致歉 | 大数据分析禁烟对烟草行业的影响有多大
  10. TeamViewer14试用版到期怎么解决--免费许可证(仅非商业用途)
  11. iOS 开发者必知的 75 个工具
  12. 想找Java项目练手,却不知道从哪找?
  13. 二十六、多线程练习题
  14. 【模拟电路】波形产生与变换设计(555+运放)
  15. hashcat破解wifi密码(kali)
  16. 刚刚,2022中科院分区表发布(附下载)
  17. Ubuntu16.04安装ROS Kinetic详细步骤
  18. LeetCode 488. 祖玛游戏
  19. 景安虚拟主机SSL证书导入教程
  20. 健身教练演示背阔肌锻炼方法动作图解

热门文章

  1. linux 加密文件,如何运用OpenSSL 对文件进行加密和解密
  2. 数学最高奖菲尔兹奖得主加入Huawei Technologies France
  3. WSL2:docker中ubuntu18.04编译webRTC
  4. Ubuntu18.04之有道词典安装
  5. Android usb audio信息获取(一)
  6. I2S原理分析(二十九)
  7. emacs+cedet解析源码定义位置
  8. android5.1去掉开机锁屏
  9. start_kernel之前的调用流程(head.s)
  10. 深度学习自学(十七):caffe-sphereface-编译matcaffe遇到的问题