mysql 转pg 两者不同的地方

server/2024/12/22 20:15:23/

        因项目数据库(原来是MySQL)要改成PostgreSQL。 项目里面的sql要做一些调整。

1,写法上的区别:

1,数据准备:

新建表格:

CREATE TABLE property_config ( CODE       VARCHAR(50)         NULL,VALUE      VARCHAR(1000)         NULL,remark     VARCHAR(250)         NULL 
);

插入数据:

INSERT INTO property_config 
VALUES (1, 'test', 'test'),(2, 'test2', 'test2');

2,select 写法

1,查询条件

1,类型

pg的会更严格,字符串的,要加引号

msyql:

SELECT CODE, VALUE, remark
FROM property_config WHERE CODE = 1;

        这样写,虽然mysql支持,但是要进行类型转换。

pg:

改为:

SELECT CODE, VALUE, remark
FROM property_config WHERE CODE = '1';

这样就正常。

2,别名 as

1,特殊处理:

别名中带 type的需要带as

mysql

select code, value, remark,  'property' type  from property_config;
select code, value, remark,  'property' types  from property_config;
select code, value, remark,  'property' typess  from property_config;

这个执行正常。

pg:执行会报错

修改为

select code, value, remark,  'property' as type  from property_config;
select code, value, remark,  'property' as types  from property_config;
select code, value, remark,  'property' typess  from property_config;

2,as 不能加 ''

mysql:

SELECT CODE, VALUE, remark,  'property' AS 'key_1'  
FROM property_config;

这个执行正常。

pg:

执行报错:

修改为:

SELECT CODE, VALUE, remark,  'property' AS key_1  
FROM property_config;

3,返回值大小写

        mysql: 区分大小写,根据写的字段大小写返回

        pg: 返回小写

        因此,写sql的时候,mysql的平时都用小写。如果写java代码,使用对象。

2,数据类型的区别:

mysql数据类型

pg数据类型

datetime

timestamp

bigint

int8

        mysql也有timestamp,但是跟datetime的精度不同。

日期格式化的区别:

数据类型

mysql格式

pg格式

日期时间

%Y-%m-%d %H:%i:%s

YYYY-MM-DD HH24:MI:SS

日期

%Y-%m-%d

YYYY-MM-DD

时间

%H:%i:%s

HH24:MI:SS

3,函数上的区别:

1,判断函数:

mysql函数

pg函数

ifnull()

COALESCE()

COALESCE() 是两边都可以用

2,日期函数:

mysql函数

pg函数

作用

date_format()

to_char()

把日期转为日期字符串

STR_TO_DATE()

to_date()

把日期字符串转为日期

STR_TO_DATE()

to_timestamp()

把日期时间字符串转为日期时间

CURRENT_TIMESTAMP()、LOCALTIME()、

NOW()、

SYSDATE()

NOW()

获取当前日期时间

1,把日期转为日期字符串

mysql:

SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s') AS format_datetime;
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d') AS format_date;
SELECT DATE_FORMAT(NOW(),'%H:%i:%s') AS format_time;

pg:

SELECT to_char(NOW(), 'YYYY-MM-DD HH24:MI:SS') AS format_datetime;
SELECT to_char(NOW(), 'YYYY-MM-DD') AS format_date;
SELECT to_char(NOW(), 'HH24:MI:SS') AS format_time; 

2,把日期字符串转为日期

mysql:

SELECT STR_TO_DATE('2024-02-28', '%Y-%m-%d') AS format_date;

pg:

SELECT TO_DATE('2024-02-28', 'YYYY-MM-DD') AS format_date;

3,把日期时间字符串转为日期时间

mysql:

SELECT STR_TO_DATE('2024-02-28 12:15:16', '%Y-%m-%d %H:%i:%s');

pg:

select to_timestamp('2024-02-28 12:15:16','yyyy-MM-dd hh24:mi:ss');

3,字符串函数:

mysql函数

pg函数

作用

find_in_set()

ANY(string_to_array('', ','))

查找字符串

GROUP_CONCAT()

array_to_string(array_agg(cname), ',') 、 string_agg(cname, ',')

字符串聚合

INSTR()

strpos()

查找字符串位置

1,查找字符串

mysql:

SELECT * FROM property_config  WHERE FIND_IN_SET('test', VALUE);

ps:

SELECT * FROM property_config t WHERE 'test' = ANY(string_to_array(value, ','));

2,字符串聚合

mysql:

SELECT GROUP_CONCAT(CODE) AS codes FROM property_config;

pg:

SELECT array_to_string(array_agg(code),',') as codes 
from property_config;
SELECT string_agg(code, ',') as codes from property_config;

3,查找字符串位置

mysql:

SELECT LOCATE('ba1l', 'footba1l');
SELECT POSITION('ba1l' IN 'footba1l');
SELECT INSTR('footba1l', 'ba1l');

pg:

 SELECT strpos('football', 'ball');  SELECT POSITION('ball' in 'football');

这边查找位置的POSITION()函数是一样的。

4,分页写法

mysql:

        分页limit x,y,x代表跳过的条数,y代表查询的数量,

pg:

        采用 limit y offset x,写法等价于mysql的limit x,y

mysql 也支持 offset 后续用,都用offset

通用写法:  LIMIT size offset size * page

java代码的话,用分页插件

5,id插入

pg没有对应于值就不能写

mysql:

insert into form_cfg(id, form_id, attr_name, attr_value, attr_type)
values(#{id}, #{formId}, #{attrName}, #{attrValue}, #{attrType})

pg:

insert into form_cfg(form_id, attr_name, attr_value, attr_type)
values(#{formId}, #{attrName}, #{attrValue}, #{attrType})

2,总结:

        在平时写代码的时候,如果有不同数据库的,要考虑通用性。像判断是否为空这种,由代码去判断,没办法兼容的,再考虑用不同的方法实现。


http://www.ppmy.cn/server/4367.html

相关文章

家庭营销广告Criteo公司首次获得MRC零售媒体测量认证

家庭营销广告Criteo公司首次获得零售媒体测量MRC认证 商业媒体公司Criteo2024年3月28日宣布,它首次获得媒体评级委员会(MRC)的认证,在其企业零售媒体平台commerce Max和commerce Yield上,在桌面、移动网络和移动应用内…

「51媒体」展会媒体邀约资源,媒体宣传服务执行

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 在组织展会时,媒体宣传服务的执行是提升展会知名度和影响力的关键环节。 确定目标媒体:根据展会的主题和目标受众,选择适合的媒体进行邀请。这可能包括…

【NPU】A800-9000服务器8*Ascend 910 B的HCCS测试

HCCS集合通信带宽数据 HCCS集合通信带宽数据timeline信息在msprof_*.json文件的HCCS层级展示 summary信息在hccs_*.csv文件汇总。 支持的型号 Atlas 训练系列产品 Atlas A2训练系列产品 测试命令 npu-smi info -t topo结果展示 NPU0 NPU1 NPU2 NPU3 …

在Rust中使用ini配置文件

一、概述 INI文件是一种无固定标准格式的配置文件。它以简单的文字与简单的结构组成,常常使用在Windows操作系统上,许多程序也会采用INI文件作为配置文件使用。Windows操作系统后来以注册表的形式取代INI档。但是INI还是流传到现在。 rust-ini是一个在R…

每日一题:C语言经典例题之矩阵对角线元素之和

题目描述 求一个33的整型矩阵对角线元素之和 输入 从键盘上输入33的整型矩阵,要求输入3行,每行3个整数,每个数之间以空格分隔。 输出 对角线元素之和,行尾换行。 样例输入 1 2 3 4 5 6 9 8 7 样例输出 13 代码 #inc…

追溯历史:SIEM 中的生成式人工智能革命

作者:来自 Elastic Mike Nichols, Mike Paquette 网络安全领域仿佛是现实世界的一个映射,安全运营中心(security operation center - SOC)就像是你的数字警察局。网络安全分析师就像是警察,他们的工作是阻止网络犯罪分…

字体反爬积累知识

目录 一、什么是字体反扒 二、Unicode编码 三、利用font包获取映射关系 一、什么是字体反扒 字体反爬是一种常见的反爬虫技术,它通过将网页中的文本内容转换为特殊的字体格式来防止爬虫程序直接获取和解析文本信息。字体反爬的原理是将常规的字符映射到特殊的字…

每日算法练习(1)

开一个新坑,记录下自己每天的算法练习,希望自己通过1个多月的学习,能够成为算法大神。 下面正式开始新坑。 两个数组的交集 这是牛客上的题,根据题意,我们有多种解法,这题用哈希比较好写。我们可以弄一个…