基于PostgreSQL和mysql数据类型对比兼容

基于PostgreSQL和mysql数据类型对比兼容

这篇文章主要介绍了基于一种数据库系统和关系型数据库数据类型对比兼容,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

1、数值类型

整数:

关系型数据库中的整数类型和程序制导相比,两者有以下区别:

mysql:mysql中支持整数1,2,3,4,8字节,同时支持有符号,无符号。并且关系型数据库中支持在数值列中指定零填充,用来将存储的数值通过填充0的方式达到指定数据类型的长度(mysql8开始不建议使用补零属性,并且在将来的关系型数据库版本中将不再支持该属性)。

pg:pg支持整数2,4,8字节,且数值都是有符号的。

mysql整数类型:

pg整数类型:

那么对于关系型数据库中的1,3字节整型,或者无符号整型以及补零特性,在程序制导中该如何实现呢?

在程序制导中我们可以使用领域来实现关系型数据库中的1,3字节整数以及无符号整型。

创建uint8,8字节无符号整型

bill=# create domain uint 8 as numeric(20,0)check(value=((2^64:numeric):numeric(20,0)-1)and值=0:numeric(20,0));

创建域

使用域,插入整型数据,且大于等于0,小于2^64

bill=#创建表t5(C1 uint 8);

创建表格

比尔=#插入t5值(-1);

错误:域uint8的值违反了检查约束" uint8_check "

比尔=#插入t5值(0);

插入0 1

比尔=#插入t5值(18446744073709551615);

插入0 1

比尔=#插入t5值(18446744073709551616);

错误:域uint8的值违反了检查约束" uint8_check "

bill=# select * from t5

c1

-

0

18446744073709551615

(2行)

同样我们也可以来创建领域实现1,3字节有无符号整型,2,4,8字节无符号等等:

创建域int1作为int2检查(值=127,值=(-128));

创建域uint1作为int2检查(值=255,值=0);

创建域uint2作为int4检查(值=65535,值=0);

创建域int3作为int4检查(值=8388607,值=(-8388608));

创建域uint3作为int4检查(值=16777215,值=0);

创建域uint4作为int8检查(值=4294967295,值=0);

将域uint8创建为数字(20,0)检查(值=((2^64:numeric):numeric(20,0)-1)且value=0:数值(20,0));

而对于关系型数据库中的零填充,我们可以使用lpad函数来实现,并且这也是关系型数据库官方文档中推荐的一种方式。

mysql中zerofill使用方式:

关系型数据库创建表t1(id int 1零填充);

查询正常,0行受影响(0.00秒)

关系型数据库插入到T1级(一种通讯线路的名称)值(4);

查询正常,1行受影响(0.00秒)

mysql select * from t1

-

| id |

-

| 004 |

-

集合中的一行(0.00秒)

pg中使用lpad函数替代:

bill=# create table t1(id int);

创建表格

比尔=#插入T1级(一种通讯线路的名称)值(123),(123456);

插入0 2

bill=# select lpad(id:text,最大值(4,长度(id:text)), 0 ),id from t1

lpad | id

- -

0123 | 123

123456 | 123456

(2行)

numeric类型:

程序制导和关系型数据库一样都支持十进制、数字类型来表示浮点数。两者的区别在于:mysql中的数字的类型整数和小数部分均最大支持65位数。

而程序制导中数字的类型支持的最大范围是:

[左131072,右16383]位数。

例如:

MySQL中

关系型数据库创建表t1(id数字(66,1));

错误1426 (42000):为" id "指定的精度66太大。最大值为65。

关系型数据库创建表t1(id数字(65,1));

查询正常,0行受影响(0.01秒)

pg中

bill=#创建表T4(id numeric(66,1));

创建表格

浮点类型:

关系型数据库和程序制导中的浮点数类型基本一致mysql .中四字节的浮点数类型有实数,浮点,4.4字节的浮点数类型双倍。程序制导中对应的也有实数、浮点数、浮点数4、浮点数8以及双精度,两者基本兼容。

少量类型:

关系型数据库中少量类型一般都是使用整数类型表示,所以支持的少量位数最大只能是64位。而在程序制导中有专门的少量类型位(范围1~83886080),以及可变长度的少量类型瓦尔比特。

序列:

在mysql中创建表时,可以使用auto_increment创建自增列,从而生成与该列相关的序列。这类似于在pg中创建一个串行列,但它们之间仍有明显的区别:

Mysql:使用auto_increment自行添加的列必须被索引,否则会报错。序列的默认初始值为1,步长为1。可以通过修改自动增量和自动增量偏移来修改初始值和步长。

PG:当在PG中创建一个序列类型的列时,相应的序列将被创建。支持的数据类型有serial2、serial4和serial8。同时,pg在创建序列时可以直接指定初始值、步长、maxvalue、缓存、圆等参数。其中顺序缓存预取多个值,可以保证不出现性能问题。Circle可以指定序列在达到最大值后将从初始值重新计数。

MySQL

mysql创建表t4 (id int auto_increment主键);

查询正常,0行受影响(0.06秒)

PostgreSQL

bill=#创建表t4(id序列);

创建表格

2、时间类型

MySQL:MySQL中与时间相关的类型包括日期日期、时间时间和日期时间、时间戳和年份类型。

PG:PG中的时间数据类型和mysql中的基本相同。不同的是pg支持timez类型,也就是带时区的时间类型,这个mysql不支持,但是pg不支持mysql中的year类型。但是,我们仍然可以通过创建一个域在pg中实现year类型。

mysql中的年份类型表示从1901年到2155年。

pg环境下mysql中年份类型的实现方法:

bill=# create domain year as int 2 check(value=1901,value=2155);

创建域

bill=#创建表ts4(c1年);

创建表格

bill=#插入ts4值(1000);

错误:域年的值违反了检查约束 year_check

bill=#插入到ts4值中(2019);

插入0 1

bill=#插入到ts4值中(2156);

错误:域年的值违反了检查约束 year_check

3、字符串类型

char/varchar类型:

Mysql和pg都支持用char类型表示固定长度的字符串,用varchar类型表示可变长度的字符串。它们之间的区别是:

Mysql:char类型最多255个字符,varchar类型最多64个字节。

PG:char类型最多10485760个字符,varchar类型最多1G字节。同时,pg还支持两种特殊的字符串类型:name类型,固定长度64字节,char类型(即不指定长度),固定长度1字节。

binary/varbinary类型:

mysql中binary(n)的最大长度是255个字符,varbinary(n)的最大长度是64k字节。使用字节流存储字符串。在pg中,bytea type用于表示二进制类型,最大为1gb。

blob/text类型:

mysql中有以下类型的blob/text:

Tinyblob,tinytext 2^8字节

Blob,文本2^16字节

中等文本2^24字节

Longblob,longtext 2^32字节

在pg中,使用bytea类型和text类型,两种类型的最大长度都是1gb。

enum类型:

mysql中最大枚举类型是64K,而pg中最大枚举类型是1GB。

set类型:

mysql中的集合类型表示没有重复值的集合,最多64个值。虽然pg中没有set类型,但是可以用数组类型代替,最大大小为1GB。

4、其它类型

json类型:

和mysql pg中的json类型基本相同,只是在记忆json函数上可能会略有不同。不过pg中的json有两种:json和jsonb,不过一般用jsonb。

除了上面列出的这些类型,pg还支持许多mysql不支持的数据类型。比如pg支持IP地址类型,在mysql中经常用int或varchar等数据类型代替。

除此之外,还有很多pg内置的数据类型是mysql不支持的:货币、区间、平面几何、全文搜索、uuid、xml、数组、复合类型、范围类型、域类型等。

同时pg有很多外部数据类型:树型、多维型、化学分子、DNA、postgis等等。

补充:Oracle与PostgreSQL使用差异对比与总结

JDBC连接:

Oracle jdbc连接字符串:db . URL=JDBC:Oracle:thin:@ 192 . 168 . 1 . 1:1521:orcl

Postgresql: db.url=JDBC的连接字符串:Postgresql:@ 192 . 168 . 1 . 1:5432/database

1、基本数据类型差异

神谕

一种数据库系统

Varchar2

可变长字符串

数字

数字的

日期

时间戳/日期/时间

不支持布尔型,可通过0/1代替

支持布尔型

2、基本函数差异

项目

神谕

一种数据库系统

系统当前时间

系统日期

现在()/当前时间戳/当前日期/当前时间

对时间或数字截取

trunc()

date_trunc()

截止字符,截止号码,截止日期

自动格式转换

需指定日期格式

例如:截止日期(时间加入, yyyy-MM-dd )

判空操作

nvl()

联合()

条件判断

解码()

情况.当.的时候.然后

双重的伪表

支持

不支持(查询常量不需要加来自)

其他用法一致的常用函数:

mod(n2,n1) - n2除n1取余数;符号(名词)判断n的符号;

楼层(名词)取小于等于n的正整数;ceil() -取大于等于n的正整数;

圆形(n,整数)对n四舍五入,保留位数为整数;trunc(n,整数)对n截取,截取保留的位数为整数;

convert(char,dest_sest,source_set)字符集转换,例:转换(用户名、 ZHS16GBK 、 UTF8 );

cast(expr as type_name) -数据类型转换,常用于数字与字符间转换,例:cast(id _ no as varchar);

部分函数的使用简析:

(1)聚结(列1,列2,列3):返回参数中第一个非空字段值

例如:coalesce(COL1,0):如果COL1为空或,则返回默认值0;否则返回COL1的值;

(2)摘录(日期):对日期特定部分提取(甲骨文和一种数据库系统使用一致)

例如:

摘录(从现在算起的年份());2018

摘录(从现在开始的月份());9

提取(从时间戳 2018-09-10 13:59:59 开始的月份);9

(3)对时间截取trunc()和date_trunc()

oracle - trunc()的用法:

trunc(sysdate, yyyy );//返回当前年的第一天2018-01-01

trunc(sysdate, mm );//返回当前月的第一天2018-09-01

trunc(sysdate, DD );//返回当前时间的年月日2018-09-14

trunc(sysdate, hh );//返回当前小时2018-09-14 13:30:50

postgreSQL - date_trunc()用法:

date_trunc(year ,now());//返回当前时间年的第一天2018-01-01 00:00:00

date_trunc(月,现在());//返回当前月的第一天2018-09-01 00:00:00

date_trunc(日,现在());//返回当前时间的年月日2018-09-14 00:00:00

date_trunc(秒,现在());//返回当前时间的年月日时分秒2018-09-14 13:30:50

(3)条件判断

甲骨文:

从双重的中选择DECODE (payments_info, CR , Credit , DB , Debit ,null);

PostgreSQL:

选择案例

当foo=CR 然后是“信用”

当foo=DB 然后是借方时

否则默认

结束

从t2开始;

3、DDL语法差异

神谕和pgSQL操作表结构语法基本一致:

修改表名:alter table TBL _用户重命名TBL _用户2;

添加约束:更改表格表名添加约束表名_列名_nn检查(不为空)

添加列:alter table TBL _用户添加年龄号(3)默认值18不为空;

更改表tbl_user添加年龄号(3)默认18后性别不为空;(在指定列后添加列)

删除列:alter table TBL _用户删除列年龄;

修改列:alter table TBL _用户修改密码默认值“000000”不为空;(修改约束)

修改列名:将表tbl _用户的列口令重命名为显示当前工作目录

只有更改列的数据类型写法有些差异

Oracle:更改表表名修改列名数据类型;

PostgreSQL:ALTER TABLE TABLE _ name ALTER column _ name TYPE datatype;

4、DML语法差异

神谕和pgSQL增删改查语法基本一致,只有upsert有差异

甲骨文:有自带的并入功能(一个强大的操作)

PostgreSQL:不支持合并操作,可以使用论冲突()做

例:

插入目标表

选择身份证,desc

来自源表

冲突时(身份证)

是否更新集合

desc=排除。desc

5、查询语句差异

(1)查询表中最新n条数据(甲骨文有一种数据库系统的rownum有极限)

postgreSQL:

选择*来自OLC。OLC _会员_因特网投标_信息订单按创建时间desc限制n;

注意:限制必须用于以.排序之后

Oracle:

写法一:

select t . * from(select * from nwd。TC _ inte _ bid _ record order by create _ time desc)t其中rownum=n;

写法二:

select * from(select t.*,row _ number()over(order by create _ time desc)rn from nwd。TC _ inte _ bid _ record t)其中rn=n;

上述写法一为通用常规写法;写法二可以对分组后数据排序,分组语句写在结束()中

(2)子查询

一种数据库系统子查询要求比较严格,必须具有别名才可以

6、 Postgresql命令行常用操作(psql)

172.0.0.1

-密码scws123

如果不想输入密码,可以在100 . pg pass隐藏文件中添加密码,格式:

172.0.0.1:5210:数据库名称:用户名:密码

注意100 . pg pass的权限问题:chmod 0600 ~/.pgpass

-查询某个库下的所有表(dt)

select * from pg_tables其中schemaname= idn _ dw

-查询某个存储过程(df)

select proname,prosrc from pg_proc其中proname= func _ dwd _ customer _ info ;

-查询某个表下的字段( d tablen _ ame)

select table_schema,table_name,t.colname,string_agg(column_name,,)作为列

来自信息_架构.列

左连接(选择pg_class.relname作为表名,pg_attribute.attname作为列名从

pg _约束内部联接pg_class

关于pg _ constraint。con relid=pg _ class。似…的

pg _属性。attrelid=pg _ class。似…的上的内部联接pg _属性

和pg _属性。attnum=pg _ constraint。图标键[1]

其中pg_constraint.contype=p) t

on table_name=t.tablename

其中表名=s10_anfd_rule

group by table_schema,table_name,t.colname

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

基于PostgreSQL和mysql数据类型对比兼容