区别一
PostgreSQL (通常称为 PG) 和 MySQL 都是广泛使用的关系型数据库管理系统 (RDBMS)。虽然它们都是用于存储和管理数据的关系数据库,但它们在一些方面有很大的区别,如下所述:
- 数据类型:PostgreSQL 支持更多的数据类型,如范围类型、网络地址类型、JSON 和 XML 数据类型等,而 MySQL 则不支持这些类型。
- 扩展性:PostgreSQL 具有很高的扩展性,可以使用自定义数据类型、函数和操作符来扩展其功能。而 MySQL 的扩展性较差,需要使用插件或存储过程来实现类似的功能。
- ACID 兼容性:PostgreSQL 是完全 ACID 兼容的数据库,而 MySQL 只在特定的存储引擎 (如 InnoDB) 中支持 ACID。
- 多版本并发控制 (MVCC):PostgreSQL 使用 MVCC 来提供高级事务隔离级别,这意味着多个事务可以同时读取和写入数据库,而不会相互干扰。MySQL 也支持 MVCC,但其实现方式不同。
- 存储引擎:MySQL 支持多个存储引擎,包括 MyISAM 和 InnoDB 等。每种存储引擎都有自己的特点和优缺点。PostgreSQL 仅支持单个存储引擎。
- SQL 标准兼容性:PostgreSQL 更加符合 SQL 标准,而 MySQL 在某些方面采用了自己的实现方式。
- 性能:在一些特定的使用场景下,MySQL 的性能可能更好。但在复杂的查询和高并发的情况下,PostgreSQL 可能表现更好。
总之,PG 和 MySQL 都是出色的关系型数据库管理系统,具有不同的特点和优劣。选择哪个取决于具体的需求和使用场景。
区别二
- 简介 PostgreSQL PostgreSQL是一个开源的关系型数据库管理系统,以其高度的可扩展性、ACID兼容性(支持原子性、一致性、隔离性和持久性)以及丰富的功能集而闻名。它支持多种操作系统,包括Linux、Windows、Mac OS等,而且具有强大的社区支持。
MySQL
MySQL也是一个开源的关系型数据库管理系统,其特点在于速度快、易于使用以及广泛的社区支持。它最初是由瑞典的开发者创建的,后来被Sun Microsystems收购,现在隶属于Oracle。
- 适用场景 PostgreSQL 复杂查询和事务处理:PostgreSQL在处理复杂查询和大量事务时表现出色,适用于需要高度数据完整性和一致性的应用程序,如金融系统或企业级应用。 地理信息系统(GIS):PostGIS是一个用于地理空间对象的开源空间数据库扩展,使得PostgreSQL成为处理地理信息的首选。 大数据和数据仓库:PostgreSQL的分区表、并行查询和流复制等功能,使其成为处理大数据和数据仓库方面的强力工具。 MySQL Web应用程序:由于其高性能和易用性,MySQL是许多Web应用程序的首选数据库,特别是在需要处理大量读操作的情况下。 小型企业应用:对于规模相对较小的企业应用程序,MySQL提供了一个稳定、经济高效的解决方案。 快速开发和迭代:MySQL具有较低的学习曲线,因此适用于快速开发和迭代的项目。
- 性能比较 PostgreSQL 复杂查询和事务:PostgreSQL在处理复杂查询和高并发事务时表现出色,这得益于其MVCC(多版本并发控制)实现。 扩展性:具有良好的扩展性,可以通过添加额外的节点来提高性能。 MySQL 读取性能:MySQL在处理大量读操作时表现优异,尤其是在使用索引时。 写入性能:MySQL的写入性能也很好,但在某些情况下可能会受到锁的影响。
- 数据模型和功能 PostgreSQL 复杂数据类型:支持诸如数组、JSON、XML等复杂数据类型,使其适用于处理半结构化数据。 触发器和存储过程:提供了强大的触发器和存储过程功能,使得可以在数据库层面实现复杂的业务逻辑。 MySQL 简单而高效的索引:MySQL提供了简单但高效的索引机制,可以很好地支持大量的读操作。 存储引擎:MySQL支持多种存储引擎,例如InnoDB、MyISAM等,可以根据应用程序的需求选择最合适的引擎。
- 安全性 PostgreSQL 高级安全性功能:PostgreSQL提供了诸如行级安全、列级安全等高级安全功能,可以帮助您更好地保护数据。 SSL支持:提供了SSL支持,确保数据在传输过程中的安全性。 MySQL 基本安全功能:MySQL也提供了基本的安全功能,但相对于PostgreSQL来说可能略显简单。 SSL支持:和PostgreSQL一样,MySQL也支持SSL。
- 总结和选择指南 在选择适合您项目的数据库时,需要考虑以下几点:
数据模型和功能需求:如果您的应用需要复杂的数据模型和强大的功能集,PostgreSQL可能是更好的选择。
性能需求:根据应用程序的读写比例和事务处理需求,选择合适的数据库以保证性能。
安全性需求:如果数据安全对您的应用至关重要,您可能会更倾向于选择PostgreSQL。
开发团队熟悉度:考虑开发团队的经验和熟悉度,以便选择一个他们能够高效利用的数据库。
函数区别
文章目录
一、格式区别
二、符号区别
三、自增区别
四、函数区别
五、数据类型转化(针对于PostgreSQL)
首先PostgreSQL有一个模式的概念。
一、格式区别
和Oracle一样,PostgreSQL也是严格区分大小写。
1
二、符号区别
和Oracle一样PostgreSQL中," " 双引号是区分库名,关键字等,而MySQL则是反单引号(tab键上方的键),pg查询时字符类型的字段必须使用单引号,而MySQL带有优化器(不是必须)。
1
三、自增区别
MySQL中使用auto_increment ,在需要的列指定自增,而pg中需要设置自增序列。
(1)使用SQL语句
①创建表时
CREATE table infisa_template_config(id serial );
②表已存在
<--设置序列从1开始,自增1-->
CREATE SEQUENCE user_id_seq START WITH 1
INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;<--设置序列-->
ALTER table user ALTER columnid SET DEFAULT nextval('user_id_seq');
(2)使用可视化工具
连接navicat15(或者使用DBeaver)
点击序列
可以通过可视化界面新建序列
注:同步数据的话,推荐通过sql方式新建序列。
四、函数区别
(1)时间转化
①时间转字符串:
MySQL: date_format(a.tag_create_date,‘%Y-%m-%d %H:%i:%s’)
PostgreSQL: to_char(a.tag_create_date,‘yyyy-mm-dd HH:MM:SS’)
②字符串转时间:
MySQL: date_format(a.tag_create_date,‘%Y-%m-%d %H:%i:%s’)
PostgreSQL: to_date(a.tag_create_date,‘yyyy-mm-dd HH:MM:SS’)
(2) IFNULL()函数
MySQL: IFNULL(a.idm,‘’)
PostgreSQL: COALESCE(a.id,‘’)
(3) sysdate()函数
MySQL: SELECT sysdate()
PostgreSQL: SELECT now()
(4) find_in_set()函数(允许在逗号分隔的字符串列表中查找指定字符串的位置)
MySQL: SELECT t.dept_id FROM sys_dept t WHERE find_in_set(‘100’, ancestors)
PostgreSQL: SELECT t.dept_id FROM sys_dept t WHERE ‘100’ = ANY (string_to_array(ancestors, ‘,’))
(5)group_concat()函数
MySQL: select a.name,group_concat(distinct city)from user_city a group by a.name;
PostgreSQL: select a.name,array_to_string(array_agg(distinct a.city),‘,’)from user_city a group by a.name;
(6)LIMIT
MySQL: select id,name from hospital.ods_user_basic limit 10,2;
PostgreSQL: select id,name from hospital.ods_user_basic limit 10 offset 2;
(7)DISTINCT
MYSQL: select DISTINCT b.id from hospital.ods_user_basic as b
PostgreSQL: select DISTINCT ON (b.id) b.* from hospital.ods_user_basic as b
(注:pg中祛重+排序 ,使用distinct on (列1) order by 列1 )
(8)MyBatis-Plus整合MySQL、PostgreSQL,LIKE使用
MySQL:
<select id="checkReportPage"resultMap="reportResultMap">
SELECT
*
FROM
infisa_medical_report
WHERE is_deleted=0 AND status =1 AND name LIKE concat('%',#{handleTask.name},'%')</select>
PostgreSQL:
<select id="checkReportPage"resultMap="reportResultMap">
SELECT
*
FROM
infisa_medical_report
WHERE is_deleted=0 AND status =1 AND name like concat('%',#{handleTask.name}::varchar,'%')</select>
(注:pg必须指定模糊查询列的数据类型,否则会报错)
五、数据类型转化(针对于PostgreSQL)
MySQL、Oracle等都是默认对数据类型进行了隐式的转换,在其他数据库varchar等字符串类型和数字可以进行自动的隐式转换,但是PG确没有这么处理,官方文档中也有针对pg的数据转换方式。
解决办法:
①强转(在查询字段上指定数据类型)
a.a1 = b.b1::int8 或者 a.a1::varchar = b.b1
②隐式类型转化(创建类型转换)
–注:创建cast需要有pg_cast系统表的权限
–注:当创建类型转换使用自动隐式转换的话如果出现多个匹配的转换此时pg会因为不知道选择哪一个去处理类型转换而报错,
–如果出现多个隐式自动转换都匹配此时还是需要手动添加转换以达到效果,或者删除多余的类型转换
CREATE CAST (INTEGER AS VARCHAR) WITH INOUT AS IMPLICIT;
CREATE CAST (VARCHAR AS INTEGER) WITH INOUT AS IMPLICIT;
CREATE CAST (BIGINT AS VARCHAR) WITH INOUT AS IMPLICIT;
CREATE CAST (VARCHAR AS BIGINT) WITH INOUT AS IMPLICIT;
附:
③查询当前类型转化:
–这个查询是当前所有的CAST,具体字段的定义同样可以参阅PG数据库官方文档里的描述
select(select typname from pg_type where oid = t.castsource) as “castsource”,
(select typname from pg_type where oid = t.casttarget) as “casttarget”,
castcontext,
castmethod
from pg_cast as t
④删除类型转化:
DROP CAST (varchar as bigint); DROP CAST (bigint as varchar);
版权归原作者 懒鸟一枚 所有, 如有侵权,请联系我们删除。