PostgreSQL和mysql数据类型对⽐兼容
1、数值类型
整数:
mysql中的整数类型和pg相⽐,两者有以下区别:
mysql:mysql中⽀持int 1,2,3,4,8 字节,同时⽀持有符号,⽆符号。并且mysql中⽀持在数值列中指定zerofill,⽤来将存储的数值通过填充0的⽅式达到指定数据类型的长度(mysql8开始不建议使⽤ZEROFILL属性,并且在将来的MySQL版本中将不再⽀持该属性)。
pg:pg⽀持 int 2,4,8 字节,且数值都是有符号的。
mysql整数类型:
pg整数类型:
那么对于mysql中的1,3字节整型,或者⽆符号整型以及zerofill特性,在pg中该如何实现呢?
在pg中我们可以使⽤domain来实现mysql中的1,3字节整数以及⽆符号整型。
创建uint8,8字节⽆符号整型
bill=# create domain uint8 as numeric(20,0) check (value <= ((2^64::numeric)::numeric(20,0)-1) and value>=0::numeric(20,0));
CREATE DOMAIN
使⽤domain,插⼊整型数据,且⼤于等于0,⼩于2^64
bill=# create table t5(c1 uint8);
CREATE TABLE
bill=# inrt into t5 values (-1);
ERROR: value for domain uint8 violates check constraint"uint8_check"
bill=# inrt into t5 values (0);
INSERT01
bill=# inrt into t5 values (18446744073709551615);
INSERT01
bill=# inrt into t5 values (18446744073709551616);
ERROR: value for domain uint8 violates check constraint"uint8_check"
bill=# lect * from t5;
c1
----------------------
18446744073709551615
(2rows)
同样我们也可以来创建domain实现1,3字节有⽆符号整型,2,4,8字节⽆符号等等:
create domain int1 as int2 CHECK(VALUE<=127AND VALUE>=(-128));
create domain uint1 as int2 CHECK(VALUE<=255AND VALUE>=0);
create domain uint2 as int4 CHECK(VALUE<=65535AND VALUE>=0);
create domain int3 as int4 CHECK(VALUE<=8388607AND VALUE>=(-8388608));
create domain uint3 as int4 CHECK(VALUE<=16777215AND VALUE>=0);
create domain uint4 as int8 CHECK(VALUE<=4294967295AND VALUE>=0);
create domain uint8 as numeric(20,0)check(value<=((2^64::numeric)::numeric(20,0)-1)and value>=0::numeric(20,0));
⽽对于mysql中的zerofill,我们可以使⽤lpad函数来实现,并且这也是mysql官⽅⽂档中推荐的⼀种⽅式。
mysql中zerofill使⽤⽅式:
mysql>create table t1(id int1 zerofill);
Query OK,0rows affected (0.00 c)
mysql>inrt into t1 values(4);
Query OK,1row affected (0.00 c)
mysql>lect*from t1;
大病申请
+------+
| id |
+------+
|004|
+------+
1row in t(0.00 c)
pg中使⽤lpad函数替代:
bill=# create table t1(id int);
袖珍人CREATE TABLE
bill=# inrt into t1 values (123),(123456);
INSERT02
bill=# lect lpad(id::text, greatest(4, length(id::text)), '0'), id from t1;
lpad | id
--------+--------
0123|123
123456|123456
(2rows)
numeric类型:
pg和mysql⼀样都⽀持decimal,numeric类型来表⽰浮点数。两者的区别在于:mysql中的numeric类型整数和⼩数部分均最⼤⽀持
新手如何买基金
65digits。
⽽pg中numeric类型⽀持的最⼤范围是:
[左131072,右16383]digits。
例如:
–mysql中
mysql>create table t1(id numeric(66,1));
ERROR 1426(42000): Too-big precision66 specified for'id'. Maximum is65.
mysql>create table t1(id numeric(65,1));
Query OK,0rows affected (0.01 c)
–pg中
bill=# create table t4(id numeric(66,1));
CREATE TABLE
浮点类型:
什么东西止咳mysql和pg中的浮点数类型基本⼀致。mysql中4 bytes的浮点数类型有real,float4,4 bytes的浮点数类型double。pg中对应的也有real,float,float4,float8以及double precision,两者基本兼容。
bit类型:
mysql中bit类型⼀般都是使⽤整数类型表⽰,所以⽀持的bit位数最⼤只能是64位。⽽在pg中有专门的bit类型bit(范围1~83886080),以及可变长度的bit类型varbit。
序列:
mysql中创建表时可以使⽤auto_increment来创建⾃增列,从⽽⽣成⼀个和该列相关的序列,这个和pg中创建rial类型的列类似,但是两者仍然有明显区别:
mysql:使⽤auto_increment的⾃增列必须要建索引,不然会报错。序列的默认初始值是1,步长为1.可以通过修改
auto_increment_increment和auto_increment_offt来修改初始值和步长。
pg:pg中创建rial类型的列时会创建相应的序列,⽀持的数据类型有rial2,rial4,rial8。同时pg创建序列时可以直接指定初始值,步长,maxvalue,cache,circle等参数。其中序列cache预取多个值,可以保证没有性能问题。circle可以指定序列达到最⼤值后从初始值开始重新计数。
–mysql
mysql>create table t4 (id int auto_increment primary key);
Query OK,0rows affected (0.06 c)
–PostgreSQL
bill=# create table t4(id rial);
CREATE TABLE
2、时间类型
mysql:mysql中时间相关的类型有⽇期date、时间time以及datetime、timestamp和year类型。
pg:pg中的时间数据类型基本和mysql⼀致。区别在于pg中⽀持timez类型,即带时区的时间类型,这个mysql中不⽀持,但是pg中不⽀持mysql中的year类型,不过我们仍然可以通过创建domain的⽅式来在pg中实现year类型。
mysql中的year类型表⽰年份从 1901年到2155。
pg中实现mysql中year类型的⽅式:
bill=# create domain year as int2 check(value >=1901 and value <=2155);
CREATE DOMAIN
bill=# create table ts4(c1 year);
CREATE TABLE
bill=# inrt into ts4 values (1000);
ERROR: value for domain year violates check constraint"year_check"
bill=# inrt into ts4 values (2019);
INSERT01
bill=# inrt into ts4 values (2156);
ERROR: value for domain year violates check constraint"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类型来表⽰⼆进制类型,最⼤不超过1G字节。
blob/text类型:
mysql中的blob/text类型分别有以下⼏种:
tinyblob、tinytext < 2^8字节
blob、text < 2^16字节
光棍难
mediumblob、mediumtext < 2^24字节
longblob、longtext < 2^32字节
pg中对应的使⽤bytea类型和text类型,两者最⼤长度均为1G字节。
enum类型:班主任介绍
mysql中的枚举类型最⼤不超过64K个值,⽽pg中最⼤为1GB
松鼠桂鱼做法t类型:
mysql中的集合t类型表⽰没有重复值的集合,最⼤64个值,在pg中虽然没有t类型,但是可以通过数组类型去代替,最⼤⽀持1GB⼤⼩。
4、其它类型
json类型:
mysql和pg中的json类型基本⼀致,区别在于默写json函数可能稍有区别。不过pg中json类型有2种json和jsonb,不过⼀般都使⽤jsonb 类型。
除了上⾯列举的这些类型之外,pg中还⽀持很多mysql中不⽀持的数据类型。例如:pg中⽀持IP地址类型,这个在mysql中常常都是使⽤int或者varchar之类的数据类型代替。
与战争有关的成语
除此之外还有很多pg内置的数据类型在mysql中是不⽀持的:货币、interval、平⾯⼏何、全⽂检索、uuid、xml、数组、复合类型、范围类型、域类型等等。
同时pg还有很多外置的数据类型:树类型、多维类型、化学分⼦、DNA、postgis等等类型。