当我们在不同数据库迁移、同步数据时,首先要做的就是把库和表的结构在目标端创建出来。

当我们把数据库的结构 dump 出来之后,这个 DDL 在目标端大概率是无法直接运行的,至少数据类型在不同数据库之间就不相同,有的数据类型在目标端根本不存在,有的数据类型即使存在但存储精度、存储空间完全不一样,这给数据同步工作带来了很多困难。

这是一个很常见的需求,navicat 的 data transfer 功能就可以做到这一点。但如果想把这个功能集成在自研的产品中,很遗憾 navicat 并不开源。

这件事应该并不难,在异构数据源之间迁移数据,数据类型的映射是必不可少的,只要数据类型映射准确,DDL 转换应该就是正确的。说干就干,我决定自己实现一个 DDL 转换工具。

功能特性

  • 目前支持 MySQLOraclePostgreSQL达梦 数据库之间的转换,当然同种类型数据库的转换也支持;

  • 支持 98% 以上的数据类型映射(余下的 2% 是各数据库的特有类型,例如 MySQL 的 point/polygon/geo,在目标端找不到支持的类型);

  • 支持 column comment, default value 等 DDL 特性;

  • 支持整库同步;

  • 提供了一个灵活的架构,使得未来添加对新数据库的支持变得轻而易举;

转换效果

MySQL 到 Oracle 的转换效果:

MySQL 到 PostgreSQL 的转换效果:

PostgreSQL 到 MySQL 的转换效果:

使用方式

MySQL 到 Oracle 的转换例子:

DataBaseConnection mysqlConn = DataBaseConnection.builder()
.jdbcUrl("jdbc:mysql://127.0.0.1:3306")
.user("username")
.password("password")
.build(); DataBaseConnection oracleConn = DataBaseConnection.builder()
.jdbcUrl("jdbc:oracle:thin:@127.0.0.1:1521/orcl")
.user("username")
.password("password")
.build(); String createTableDDL = new Transformer(mysqlConn, oracleConn)
.transformCreateTableDDL("cdc_test_source", ".*") // .* 表示整库同步, 或配置具体表名
.getTransformedCreateTableDDL();
System.out.println(createTableDDL);

MySQL 到 达梦 的转换例子:

DataBaseConnection mysqlConn = DataBaseConnection.builder()
.jdbcUrl("jdbc:mysql://127.0.0.1:3306")
.user("username")
.password("password")
.build(); DataBaseConnection damengConn = DataBaseConnection.builder()
.jdbcUrl("jdbc:dm://127.0.0.1:5236")
.user("username")
.password("password")
.build(); boolean result = new Transformer(mysqlConn, postgresqlConn)
.transformCreateTableDDL("cdc_test_source", "test_table_1")
.executeCreateTable(); // execute ddl

最关键的是数据类型映射,这里整理了每种数据库的关键数据类型的对应关系,数据类型较多,查阅资料并非都来自官网,难免有纰漏,欢迎留言指正。

MySQL

MySQL 和 Oracle、PostgreSQL、DM的数据类型映射关系:
Data Type Mapping
MySQL Oracle Note
char CHAR 无论字符串的实际长度是多少,char 类型始终填充空格以达到指定长度。
MySQL 的 char 类型最大长度为 255,
Oracle 的 CHAR 类型最大长度为 2000。
varchar
tinytext
enum
set
VARCHAR2 MySQL 不限制 varchar 类型的最大长度,
但是限制了单条记录的最大长度为 65535 字节。

Oracle 12c 及以前的版本中,VARCHAR2 的最大长度为 4000,
在Oracle 12c 及更新的版本中,VARCHAR2 的最大长度为 32767,
但需要在创建表时显式指定使用 MAX 选项。
tinyint
smallint
SMALLINT
mediumint
int
bigint
INT
float
double
FLOAT
decimal
numeric
NUMBER MySQL 的 decimal 类型和 numeric 类型是同义词,底层都采用 decimal 类型存储。
使用固定长度存储,用于存储精确的小数值,特别适合金融和货币相关的数据。
语法:decimal(presision, scale),其中 precision 是总的有效数字位数,scale 是小数点后的位数。
Oracle 的 NUMBER 类型可以存储整数、小数以及非常大或者非常小的数值,
使用可变长度的存储,根据数值大小动态分配存储空间。
语法 NUMBER(precision, scale),其中 precision 是总的有效数字位数,scale 是小数点后的位数。
Oracle 的 NUMBER 类型支持 1-38 位的 precision,scale 可以是 -84 到 127,
当 scale 取负数时会使得数值按指定的位数四舍五入到最近的倍数。
real REAL Oracle 的 REAL 类型用于存储浮点数,适合存储不需要高精度的小数数据,
如果对精度要求较高,建议使用 BINARY_FLOAT 或者 BINARY_DOUBLE 类型。
year NUMBER(4)
date
time
DATE
datetime
timestamp
TIMESTAMP
tinyblob
blob
mediumblob
longblob
BLOB MySQL 的 longblob 是一种用于存储较大二进制数据的数据类型。
它主要用于存储大文件,如图像、音频、视频、以及其他类型的二进制文件。
最大存储长度为 4GB。

Oracle 的 BLOB (Binary Large Object) 类型,
适合存储二进制数据,如图像、音频、视频等非文本数据。
BLOB 采用变长存储方式,存储空间依据实际数据长度动态调整,最大长度为 4GB。
text
mediumtext
longtext
json
linestring
multilinestring
CLOB MySQL 中的 longtext 适用于存储大量的文本信息,例如日志文件、文章、用户评论等,
最大存储长度为 4GB。

Oracle 的 CLOB (Character Large Object) 类型,
适合存储大文本数据,如长文本、XML 文档或其他字符数据。
CLOB 采用变长存储方式,存储空间依据实际数据长度动态调整,最大长度为 4GB。
bit
binary
varbinary
RAW Oracle 用 RAW 类型保存位串,声明方式为 RAW(size)
采用固定长度存储,最大 size 为 2000。
geometry
geometrycollection
point
multipoint
polygon
multipolygon
暂不支持
Data Type Mapping
MySQL PostgreSQL Note
char char MySQL 的 char 类型最大长度为 255;
PostgreSQL 的 char 类型最大长度为 10,485,760。
varcahr
enum
set
varchar MySQL 不限制 varchar 类型的最大长度,
但是限制了单条记录的最大长度为 65535 字节。

PostgreSQL 的 varchar 类型最大长度为 1GB。
tinytext
text
mediumtext
longtext
text
tinyint
smallint
year
int2
mediumint
int
int4
bigint int8
float float4
double float8
numeric
decimal
numeric
boolean bool
date date
time time
datetime
timestamp
timestamp
tinyblob
blob
mediumblob
longblob
geometry
geometrycollection
linestring
multilinestring
binary
varbinary
bytea
json json
bit bit
point point
polygon polygon
Data Type Mapping
MySQL DM Note
char CHAR 无论字符串的实际长度是多少,char 类型始终填充空格以达到指定长度。
MySQL 的 char 类型最大长度为 255,
DM 的 CHAR 类型最大长度为 32767。
varchar
tinytext
enum
set
VARCHAR MySQL 不限制 varchar 类型的最大长度,
但是限制了单条记录的最大长度为 65535 字节。

DM 的 VARCHAR 类型最大长度为 32767。
tinyint TINYINT
smallint SMALLINT
mediumint
int
INT
bigint BIGINT
float FLOAT
double DOUBLE
decimal DECIMAL MySQL 的 decimal 类型和 numeric 类型是同义词,底层都采用 decimal 类型存储。
使用固定长度存储,用于存储精确的小数值,特别适合金融和货币相关的数据。
语法:decimal(presision, scale),其中 precision 是总的有效数字位数,scale 是小数点后的位数。
numeric NUMERIC
date DATE
time
datetime
timestamp
TIMESTAMP
tinyblob
blob
mediumblob
longblob
BLOB MySQL 的 longblob 是一种用于存储较大二进制数据的数据类型。
它主要用于存储大文件,如图像、音频、视频、以及其他类型的二进制文件。
最大存储长度为 4GB。

DM 的 BLOB 类型最大存储长度为 2GB。
text
mediumtext
longtext
json
linestring
multilinestring
CLOB MySQL 中的 longtext 适用于存储大量的文本信息,例如日志文件、文章、用户评论等,
最大存储长度为 4GB。

DM 的 CLOB (Character Large Object) 类型,
最大存储长度为 2GB。
bit
binary
BINARY MySQL 的 bit 类型最大存储长度位 64,
MySQL 的 binary 类型最大存储长度为 255。

DM 的 BINARY 类型最大存储长度为 3847。
varbinary VARBINARY MySQL 的 vrbinary 类型最大存储长度为 65535。

DM 的 VARBINARY 类型最大存储长度为 32767。
geometry
geometrycollection
point
multipoint
polygon
multipolygon
暂不支持

Oracle

Oracle 和 MySQL、PostgreSQL、DM的数据类型映射关系:
Data Type Mapping
Oracle MySQL Note
CHAR
NCHAR
char 无论字符串的实际长度是多少,char 类型始终填充空格以达到指定长度。

Oracle 的 char 类型最大长度为 2000;
Oracle 的 nchar 类型最大长度为 1000,适用于需要存储多语言国际化字符;

MySQL 的 char 类型最大长度为 255。
VARCHAR
VARCHAR2
NVARCHAR2
varchar Oracle 12c 及以前的版本中,varchar2 的最大长度为 4000,
在Oracle 12c 及更新的版本中,varchar2 的最大长度为 32767。

MySQL 不限制 varchar 类型的最大长度,
但是限制了单条记录的最大长度为 65535 字节。
NUMBER
NUMERIC
DECIMAL
decimal Oracle 中,numeric,decimal,number 为同义词,底层存储的都是 number 类型。
Oracle 的 NUMBER 类型可以存储整数、小数以及非常大或者非常小的数值,
使用可变长度的存储,根据数值大小动态分配存储空间。
语法 NUMBER(precision, scale),其中 precision 是总的有效数字位数,scale 是小数点后的位数。
Oracle 的 NUMBER 类型支持 1-38 位的 precision,scale 可以是 -84 到 127,
当scale取负数时会使得数值按指定的位数四舍五入到最近的倍数。

MySQL 中 decimal 用于存储精确的小数值,特别适合金融和货币相关的数据。
语法:decimal(presision, scale),其中 precision 是总的有效数字位数,scale 是小数点后的位数。
MySQL 的 decimal 类型 precision 最大取值是 65,scale 的最大取值是 30。
INT
INTEGER
int
SMALLINT smallint
FLOAT
BINARY_FLOAT
float Oracle 的 BINARY_FLOAT 专门用于存储单精度浮点数,采用固定 32 位长度存储。
适用于需要高性能和较低存储开销的浮点数运算场景。
FLOAT 类型实际上是 NUMBER 类型的变种,采用变长存储,
精度高于 BINARY_FLOAT,性能低于 BINARY_FLOAT。
REAL real Oracle 的 REAL 类型用于存储浮点数,适合存储不需要高精度的小数数据,
如果对精度要求较高,建议使用 BINARY_FLOAT 或者 BINARY_DOUBLE 类型。
BINARY_DOUBLE
DOUBLE PRECISION
double
DATE date
TIMESTAMP
TIMESTAMP WITH TIME ZONE
datetime
CLOB
NCLOB
LONG
longtext Oracle 的 LONG 类型在早期版本非常常用,
但由于一些不便之处,在 9i 版本开始引入了 CLOB 来替代 LONG。
LONG 的最大存储长度为 2GB,CLOB 的最大存储长度为 4GB。
NCLOB 适合存储需要支持多种语言和特殊字符集的文本数据,最大存储长度为 4GB。

MySQL 中的 longtext 适用于存储大量的文本信息,例如日志文件、文章、用户评论等,
最大存储长度为 4GB。
BLOB longblob Oracle 的 BLOB (Binary Large Object) 类型,
适合存储二进制数据,如图像、音频、视频等非文本数据。
BLOB 采用变长存储方式,存储空间依据实际数据长度动态调整,最大长度为 4GB。

MySQL 的 longblob 是一种用于存储较大二进制数据的数据类型。
它主要用于存储大文件,如图像、音频、视频、以及其他类型的二进制文件。
最大存储长度为 4GB。
RAW varbinary Oracle 用 RAW 类型保存位串,声明方式为 RAW(size)
采用固定长度存储,最大 size 为 2000。

MySQL 的 varbinary 最大长度受限于单条记录的大小 (65535字节)
Data Type Mapping
Oracle PostgreSQL Note
CHAR
NCHAR
char 无论字符串的实际长度是多少,char 类型始终填充空格以达到指定长度。

Oracle 的 char 类型最大长度为 2000;
Oracle 的 nchar 类型最大长度为 1000,适用于需要存储多语言国际化字符;

PostgreSQL 的 char 类型最大长度为 10,485,760。
VARCHAR
VARCHAR2
NVARCHAR2
varchar Oracle 12c 及以前的版本中,varchar2 的最大长度为 4000,
在Oracle 12c 及更新的版本中,varchar2 的最大长度为 32767。

PostgreSQL 的 varchar 类型最大长度为 1GB。
NUMBER
NUMERIC
DECIMAL
decimal Oracle 中,numeric,decimal,number 为同义词,底层存储的都是 number 类型。
Oracle 的 NUMBER 类型可以存储整数、小数以及非常大或者非常小的数值,
使用可变长度的存储,根据数值大小动态分配存储空间。
语法 NUMBER(precision, scale),其中 precision 是总的有效数字位数,scale 是小数点后的位数。
Oracle 的 NUMBER 类型支持 1-38 位的 precision,scale 可以是 -84 到 127,
当scale取负数时会使得数值按指定的位数四舍五入到最近的倍数。

PostgreSQL 中 decimal 用于存储精确的小数值,特别适合金融和货币相关的数据。
语法:decimal(presision, scale),其中 precision 是总的有效数字位数,scale 是小数点后的位数。
SMALLINT
INT
INTEGER
int8
FLOAT
BINARY_FLOAT
float4 Oracle 的 BINARY_FLOAT 专门用于存储单精度浮点数,采用固定 32 位长度存储。
适用于需要高性能和较低存储开销的浮点数运算场景。
FLOAT 类型实际上是 NUMBER 类型的变种,采用变长存储,
精度高于 BINARY_FLOAT,性能低于 BINARY_FLOAT。
BINARY_DOUBLE
DOUBLE PRECISION
float8
DATE date
TIMESTAMP timestamp
TIMESTAMP WITH TIME ZONE timestampz
CLOB
NCLOB
LONG
text Oracle 的 LONG 类型在早期版本非常常用,
但由于一些不便之处,在 9i 版本开始引入了 CLOB 来替代 LONG。
LONG 的最大存储长度为 2GB,CLOB 的最大存储长度为 4GB。
NCLOB 适合存储需要支持多种语言和特殊字符集的文本数据,最大存储长度为 4GB。

PostgreSQL 中的 text 适用于存储大量的文本信息,
例如日志文件、文章、用户评论等,最大存储长度为 1GB。
BLOB bytea Oracle 的 BLOB (Binary Large Object) 类型,
适合存储二进制数据,如图像、音频、视频等非文本数据。
BLOB 采用变长存储方式,存储空间依据实际数据长度动态调整,最大长度为 4GB。
PostgreSQL 中,bytea 是一种用于存储二进制数据的特殊数据类型。
可以用来存储任意二进制内容,
最大存储 1GB。
RAW varbit Oracle 用 RAW 类型保存位串,声明方式为 RAW(size)
采用固定长度存储,最大 size 为 2000。

PostgreSQL 的 varbit 最大存储长度为 1GB。
Data Type Mapping
Oracle DM Note
CHAR
NCHAR
CHAR 无论字符串的实际长度是多少,char 类型始终填充空格以达到指定长度。

Oracle 的 char 类型最大长度为 2000;
Oracle 的 nchar 类型最大长度为 1000,适用于需要存储多语言国际化字符;

DM 的 CHAR 类型最大长度为 32767。
VARCHAR
VARCHAR2
NVARCHAR2
VARCHAR Oracle 12c 及以前的版本中,varchar2 的最大长度为 4000,
在Oracle 12c 及更新的版本中,varchar2 的最大长度为 32767。

DM 的 VARCHAR 类型最大长度为 32767。
LONG VARCHAR LONGVARCHAR Oracle 的 LONG VARCHAR 类型底层采用 LONG 存储,
LONG 类型在 Oracle 9i 版本之后被 CLOB 取代,
LONG 类型的最大存储长度为 2GB。

DM 的 LONGVARCHAR 类型用于存储长的文本串,最大存储长度为 2GB。
SMALLINT SMALLINT
INT
INTEGER
INT
FLOAT
BINARY_FLOAT
FLOAT Oracle 的 BINARY_FLOAT 专门用于存储单精度浮点数,采用固定 32 位长度存储。
适用于需要高性能和较低存储开销的浮点数运算场景。
FLOAT 类型实际上是 NUMBER 类型的变种,采用变长存储,
精度高于 BINARY_FLOAT,性能低于 BINARY_FLOAT。
BINARY_DOUBLE
DOUBLE PRECISION
DOUBLE
NUMBER
DECIMAL
DECIMAL Oracle 中,numeric,decimal,number 为同义词,底层存储的都是 number 类型。
Oracle 的 NUMBER 类型可以存储整数、小数以及非常大或者非常小的数值,
使用可变长度的存储,根据数值大小动态分配存储空间。
语法 NUMBER(precision, scale),其中 precision 是总的有效数字位数,scale 是小数点后的位数。
Oracle 的 NUMBER 类型支持 1-38 位的 precision,scale 可以是 -84 到 127,
当scale取负数时会使得数值按指定的位数四舍五入到最近的倍数。

DM 中 DECIMAL 类型用于存储精确的小数值,特别适合金融和货币相关的数据。
语法:decimal(presision, scale),其中 precision 是总的有效数字位数,scale 是小数点后的位数。
NUMERIC NUMERIC
REAL REAL Oracle 的 REAL 类型用于存储浮点数,适合存储不需要高精度的小数数据,
如果对精度要求较高,建议使用 BINARY_FLOAT 或者 BINARY_DOUBLE 类型。
DATE DATE
TIMESTAMP TIMESTAMP
TIMESTAMP WITH TIME ZONE TIMESTAMP WITH TIME ZONE
CLOB
NCLOB
LONG
CLOB Oracle 的 LONG 类型在早期版本非常常用,
但由于一些不便之处,在 9i 版本开始引入了 CLOB 来替代 LONG。
LONG 的最大存储长度为 2GB,CLOB 的最大存储长度为 4GB。
NCLOB 适合存储需要支持多种语言和特殊字符集的文本数据,最大存储长度为 4GB。

DM 的 CLOB 适用于存储大量的文本信息,例如日志文件、文章、用户评论等,
最大存储长度为 2GB。
BLOB BLOB Oracle 的 BLOB (Binary Large Object) 类型,
适合存储二进制数据,如图像、音频、视频等非文本数据。
BLOB 采用变长存储方式,存储空间依据实际数据长度动态调整,最大长度为 4GB。

DM 的 BLOB 是一种用于存储较大二进制数据的数据类型。
它主要用于存储大文件,如图像、音频、视频、以及其他类型的二进制文件。
最大存储长度为 2GB。
RAW VARBINARY Oracle 用 RAW 类型保存位串,声明方式为 RAW(size)
采用固定长度存储,最大 size 为 2000。

DM 的 BINARY 类型用于存储固定长度的二进制数据,如校验码、加密密钥等。
BINARY 的最大存储长度为 3847。
DM 的 VARBINARY 用于存储可变长度的二进制数据。
LONG RAW LONGVARBINARY Oracle 的 LONG RAW 类型用于存储可变长度的二进制数据,
最多存储 2GB。适用于存储较大二进制文件的场景,如图像、视频等。

DM 的 LONGVARBINARY 类型也是为存储可变长度的大型二进制数据而设计。

PostgreSQL

PostgreSQL 和 MySQL、Oracle、DM的数据类型映射关系:
Data Type Mapping
PostgreSQL MySQL Note
char char
varchar varchar
inet varchar(45) PostgreSQL 的 inet 类型用于存储 IP 地址
uuid varchar(32)
text
xml
text
int2 smallint
int4
serial
int PostgreSQL 的 serial 类型会自动自增,
实际上应该对应 MySQL 的 int AUTO_INCREMENT,
但是 MySQL 的表中只允许一个自增字段,且这个字段必须是主键。
int8
bigserial
bigint PostgreSQL 的bigserial类型会自动自增,
实际上应该对应 MySQL 的 bigint AUTO_INCREMENT,
但是 MySQL 的表中只允许一个自增字段,且这个字段必须是主键。
float4 float
float8 double
numeric
decimal
decimal
bool boolean
date date
time time
datetime
timestamp
timestamp
timestampz datetime
bit bit
json
jsonb
json
point point
polygon polygon
bytea blob
Data Type Mapping
PostgreSQL Oracle Note
char CHAR PostgreSQL 的char类型最大长度为 10,485,760。
Oracle 的char类型最大存储长度为 2000。
bool CHAR(1) PostgreSQL 的bool类型只能存储 1 位字符:t / f
varchar VARCHAR2 PostgreSQL 的varchar类型最大长度为 1GB。

Oracle 12c 及以前的版本中,VARCHAR2的最大长度为 4000,
在Oracle 12c 及更新的版本中,VARCHAR2的最大长度为 32767。
inet VARCHAR2(45) PostgreSQL 的inet类型用于存储 IP 地址
uuid VARCHAR2(32)
int2 SMALLINT
int4
int8
INT
float4 BINARY_FLOAT
float8 BINARY_DOUBLE
numeric NUMERIC
decimal DECIMAL
date DATE
time TIME
datetime
timestamp
TIMESTAMP
timestampz TIMESTAMP WITH TIME ZONE
bit RAW(1) PostgreSQL 的bit类型用于存储 1 位二进制位值,只能存0/1。
Oracle 用 RAW 类型保存位串,声明方式为RAW(size)
采用固定长度存储,最大 size 为 2000。
json
text
xml
CLOB PostgreSQL 中,
json用于将 JSON 存储为文本格式,
text的最大存储长度为 1GB。
xml用于存储 XML 文本,最大存储长度 1GB。

Oracle 的CLOB类型最大存储长度为 2GB。
bytea
jsonb
BLOB PostgreSQL 中,
jsonb用于将 JSON 存储为二进制格式。
bytea是一种用于存储二进制数据的特殊数据类型。
它的全名是 “byte array”,可以用来存储任意二进制内容,
如文件、图像或其他非文本数据,最大存储 1GB。
varbit 类型的最大存储长度为 1GB。

Oracle 的BLOB类型最大存储长度为 2GB。
point
polygon
不支持
Data Type Mapping
PostgreSQL DM Note
char CHAR PostgreSQL 的char类型最大长度为 10,485,760。
DM 的 CHAR 类型最大长度为 32767。
bool CHAR(1) PostgreSQL 的bool类型存储一位字符:t or f,
在 DM 中用 CHAR(1) 来存储。
varchar VARCHAR PostgreSQL 的varchar类型最大长度为 1GB。
DM 的 VARCHAR 类型最大长度为 32767。
inet VARCHAR(45) PostgreSQL 的 inet 类型用于存储 IP 地址
uuid VARCHAR(32)
int2 SMALLINT
int4
serial
INT PostgreSQL 的 serial 类型会自动自增,
这个特性在 DM 中不支持。
int8
bigserial
BIGINT PostgreSQL 的 bigserial 类型会自动自增,
这个特性在 DM 中不支持。
float4 FLOAT
float8 DOUBLE
numeric NUMERIC
decimal DECIMAL
date DATE
time TIME
datetime
timestamp
TIMESTAMP
timestampz TIMESTAMP WITH TIME ZONE
bit BIT
jsonb
bytea
varbit
BLOB PostgreSQL 中,
jsonb用于将 JSON 存储为二进制格式。
bytea是一种用于存储二进制数据的特殊数据类型。
它的全名是 “byte array”,可以用来存储任意二进制内容,
如文件、图像或其他非文本数据,最大存储 1GB。
varbit 类型的最大存储长度为 1GB。

DM 的BLOB最多存储 2GB。
json
text
xml
CLOB PostgreSQL 中,
json用于将 JSON 存储为文本格式,
text的最大存储长度为 1GB。
point
polygon
不支持 PostgreSQL 的pointpolygon类型用于存储几何数据。

DM

DM 和 MySQL、Oracle、PostgreSQL 的数据类型映射关系:
Data Type Mapping
DM MySQL Note
CHAR char 无论字符串的实际长度是多少,CHAR 类型始终填充空格以达到指定长度。

DM 的 CHAR 类型最大长度为 32767。
MySQL 的 char 类型最大长度为 255。
VARCHAR varchar DM 的 VARCHAR 类型最大长度为 32767。

MySQL 的 varchar 类型最大长度为 65535。
TINYINT tinyint
SMALLINT smallint
INT int
BIGINT bigint
FLOAT float
DOUBLE double
DECIMAL decimal DM 中 DECIMAL 类型用于存储精确的小数值,特别适合金融和货币相关的数据。
语法:decimal(presision, scale),其中 precision 是总的有效数字位数,scale 是小数点后的位数。
NUMERIC numeric
DATE
DATETIME WITH TIME ZONE
date
TIMESTAMP
TIMESTAMP WITH TIME ZONE
timestamp
CLOB
LONGVARCHAR
longtext DM 的 CLOB 适用于存储大量的文本信息,
例如日志文件、文章、用户评论等,最大存储长度为 2GB。
DM 的 LONGVARCHAR 类型用于存储长的文本串,最大存储长度为 2GB。

MySQL 中的 longtext 适用于存储大量的文本信息,最大存储长度为 4GB
BLOB
LONGVARBINARY
longblob DM 的 BLOB 是一种用于存储较大二进制数据的数据类型。
它主要用于存储大文件,
如图像、音频、视频、以及其他类型的二进制文件。最大存储长度为 2GB。

MySQL 的 longblob 类型最大存储长度为 4GB。
BIT bit DM 的 BIT 类型用于存储 1 位二进制位值,只能存0/1。
MySQL 的 bit 类型最大存储长度为 64 位。
BINARY
VARBINARY
varbinary DM 的 BINARY 类型用于存储固定长度的二进制数据,
如校验码、加密密钥等,最大存储长度为 3847。

MySQL 的 varbinary 类型用于存储位序列,最大存储长度为 65535。
Data Type Mapping
DM Oracle Note
CHAR CHAR 无论字符串的实际长度是多少,CHAR 类型始终填充空格以达到指定长度。

Oracle 的 CHAR 类型最大长度为 2000;

DM 的 CHAR 类型最大长度为 32767。
BIT CHAR(1) DM 的 BIT 类型用于存储二进制位值,只能存0/1。
VARCHAR VARCHAR2 Oracle 12c 及以前的版本中,VARCHAR2 的最大长度为 4000,
在Oracle 12c 及更新的版本中,VARCHAR2 的最大长度为 32767。

DM 的 VARCHAR 类型最大长度为 32767。
LONGVARCHAR LONG VARCHAR Oracle 的 LONG VARCHAR 类型底层采用 LONG 存储,
LONG 类型在 Oracle 9i 版本之后被 CLOB 取代,
LONG 类型的最大存储长度为 2GB。
Oracle 的表中只允许存在一个 LONG 类型的 COLUMN,例如 LONG VARCHAR 和 LONG RAW 类型,只允许一个列存在。

DM 的 LONGVARCHAR 类型用于存储长的文本串,最大存储长度为 2GB。
TINYINT
SMALLINT
SMALLINT
INT
BIGINT
INT
FLOAT FLOAT
DOUBLE BINARY_DOUBLE
DECIMAL DECIMAL Oracle 中,numeric,decimal,number 为同义词,底层存储的都是 number 类型。
Oracle 的 NUMBER 类型可以存储整数、小数以及非常大或者非常小的数值,
使用可变长度的存储,根据数值大小动态分配存储空间。
语法 NUMBER(precision, scale),其中 precision 是总的有效数字位数,scale 是小数点后的位数。
Oracle 的 NUMBER 类型支持 1-38 位的 precision,scale 可以是 -84 到 127,
当scale取负数时会使得数值按指定的位数四舍五入到最近的倍数。

DM 中 DECIMAL 类型用于存储精确的小数值,特别适合金融和货币相关的数据。
语法:decimal(presision, scale),其中 precision 是总的有效数字位数,scale 是小数点后的位数。
NUMERIC NUMERIC
REAL REAL Oracle 的 REAL 类型用于存储浮点数,适合存储不需要高精度的小数数据,
如果对精度要求较高,建议使用 BINARY_FLOAT 或者 BINARY_DOUBLE 类型。
DATE DATE
TIMESTAMP TIMESTAMP
TIMESTAMP WITH TIME ZONE
DATETIME WITH TIME ZONE
TIMESTAMP WITH TIME ZONE
CLOB CLOB Oracle 的 CLOB 类型适合存储大量文本信息,
最大存储长度为 4GB。

DM 的 CLOB 适用于存储大量的文本信息,例如日志文件、文章、用户评论等,
最大存储长度为 2GB。
BLOB BLOB Oracle 的 BLOB (Binary Large Object) 类型,
适合存储二进制数据,如图像、音频、视频等非文本数据。
BLOB 采用变长存储方式,存储空间依据实际数据长度动态调整,最大长度为 4GB。

DM 的 BLOB 是一种用于存储较大二进制数据的数据类型。
它主要用于存储大文件,如图像、音频、视频、以及其他类型的二进制文件。
最大存储长度为 2GB。
BINARY
VARBINARY
RAW Oracle 用 RAW 类型保存位串,声明方式为 RAW(size)
采用固定长度存储,最大 size 为 2000。

DM 的 BINARY 类型用于存储固定长度的二进制数据,如校验码、加密密钥等。
BINARY 的最大存储长度为 3847。
DM 的 VARBINARY 用于存储可变长度的二进制数据。
LONGVARBINARY LONG RAW Oracle 的 LONG RAW 类型用于存储可变长度的二进制数据,
最多存储 2GB。适用于存储较大二进制文件的场景,如图像、视频等。

DM 的 LONGVARBINARY 类型也是为存储可变长度的大型二进制数据而设计。
Data Type Mapping
DM PostgreSQL Note
CHAR char 无论字符串的实际长度是多少,CHAR 类型始终填充空格以达到指定长度。
DM 的 CHAR 类型最大长度为 32767。
PostgreSQL 的 char 类型最大长度为 10,485,760。
VARCHAR
LONGVARCHAR
varchar DM 的 VARCHAR 类型最大长度为 32767。

DM 的 LONGVARCHAR 类型用于存储长的文本串,最大存储长度为 2GB。

PostgreSQL 的 varchar 类型最大长度为 1GB。
TINYINT
SMALLINT
int2
INT int4
BIGINT int8
FLOAT float4
DOUBLE float8
DECIMAL decimal DM 中 DECIMAL 类型用于存储精确的小数值,特别适合金融和货币相关的数据。
语法:decimal(presision, scale),其中 precision 是总的有效数字位数,scale 是小数点后的位数。
NUMERIC numeric
DATE date
TIMESTAMP timestamp
TIMESTAMP WITH TIME ZONE
DATETIME WITH TIME ZONE
timestampz
CLOB text DM 的 CLOB 适用于存储大量的文本信息,
例如日志文件、文章、用户评论等,最大存储长度为 2GB。

PostgreSQL 的 text 类型用于存储大型文本数据,
最大存储长度为 1GB。
BLOB
LONGVARBINARY
bytea DM 的 BLOB 是一种用于存储较大二进制数据的数据类型。
它主要用于存储大文件,
如图像、音频、视频、以及其他类型的二进制文件。最大存储长度为 2GB。

PostgreSQL 的 bytea 类型最大存储长度为 1GB。
BIT bit DM 的 BIT 类型用于存储 1 位二进制位值,只能存0/1。
PostgreSQL 的 bit 类型用于存储 1 位二进制位值,只能存0/1。
BINARY
VARBINARY
varbit DM 的 BINARY 类型用于存储固定长度的二进制数据,
如校验码、加密密钥等。
BINARY 的最大存储长度为 3847。
DM 的 VARBINARY 用于存储可变长度的二进制数据。

PostgreSQL 的 varbit 类型用于存储位序列,最大存储长度为 1GB。

扩展方式

扩展方式也很灵活,按照以下步骤:

  1. 先查阅数据库支持哪些数据类型,重点关注数据类型的精度、存储限制,以免在数据同步过程中出现精度损失。准备好数据类型的映射关系,文件命名:xxx2zzz.json,例如 MySQL2Hive.json;

  2. DataBaseType 类中新增支持的数据库类型:

    public enum DataBaseType {
    MYSQL("MySQL"), ORACLE("Oracle"), POSTGRESQL("PostgreSQL"), DAMENG("DM");
    }
  3. DataBaseConnection 类中新增对 jdbcUrl 的识别分类:

    /**
    * 从jdbcUrl中解析数据库类型
    *
    * @param jdbcUrl
    * @return
    */
    private DataBaseType parseDataBaseTypeFromJdbcUrl(String jdbcUrl) {
    if (jdbcUrl.startsWith("jdbc:mysql")) {
    return DataBaseType.MYSQL;
    } else if (jdbcUrl.startsWith("jdbc:oracle")) {
    return DataBaseType.ORACLE;
    } else if (jdbcUrl.startsWith("jdbc:dm")) {
    return DataBaseType.DAMENG;
    } else if (jdbcUrl.startsWith("jdbc:postgresql")) {
    return DataBaseType.POSTGRESQL;
    } else {
    throw new IllegalArgumentException("Unsupported jdbc type for " + jdbcUrl);
    }
    }
  4. 新增 BaseMetaDataFetcher 的扩展类 XxxMetaDataFetcher,如果新增数据库元数据信息获取方式有所区别,覆盖 BaseMetaDataFetcher 中的实现,参照 OracleMetaDataFetcher 类;

  5. 新增 BaseDdlGenerator 的扩展类 XxxDdlGenerator,如果新增数据库的 DDL 语法有所区别,覆盖 BaseDdlGenerator 中的实现,参照 MySQLDdlGenerator 类;

写在最后

源码地址 https://github.com/redburning/database-ddl-transformer

如果大家使用过程中发现了问题,欢迎在 GitHub 上提 issue,提 issue 比给 star 更让我 appreciated!

大家如果还用过哪些趁手的数据同步工具,欢迎留言、讨论。

异构数据源DDL自动转换的更多相关文章

  1. 异构数据源海量数据交换工具-Taobao DataX 下载和使用

    DataX介绍 DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesystem)之间的数据交换. 目前成熟的数据导入 ...

  2. SpringBoot中mybatis配置自动转换驼峰标识没有生效

    mybatis提供了一个配置: #开启驼峰命名转换 mybatis.configuration.map-underscore-to-camel-case=true 使用该配置可以让mybatis自动将 ...

  3. DataX异构数据源离线同步工具json文件配置说明

    DataX 是阿里开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).HDFS.Hive.ODPS.HBase.FTP等各种异构数据源之间稳定高效的数据同步功能 ...

  4. (二)JPA 连接工厂、主键生成策略、DDL自动更新

    (一)JPA的快速入门 2.JPA连接工厂 通过之前的 代码 实现已经清楚的发现了整个的JPA实现步骤,但是这个步骤似乎有一些繁琐了,毕竟最终所关心的一定是EntityManager对象实例,而要想获 ...

  5. [占位-未完成]scikit-learn一般实例之十一:异构数据源的特征联合

    [占位-未完成]scikit-learn一般实例之十一:异构数据源的特征联合 Datasets can often contain components of that require differe ...

  6. Struts2 OGNL 自动转换Date类型的一些注意事项

    Strut2 有比较完善的使用OGNL的jsp标签自动转化为对应的后台对象的功能. 这里java.util.Date的自动转化有一些需要注意的地方(局部转换): 1.必须要在struts的xml文件中 ...

  7. PHP是弱类型语言,自动转换,强制转换

    强制转换: (int) - 转换成整型 (bool) - 转换.成布尔型 (float) - 转换成浮点型 (string) - 转换成字符串 (array) - 转换成数组 (object) - 转 ...

  8. long l=88;这个表达式是正确的,因为long比int类型大,会发生自动转换

    long l=88;这个表达式是正确的,因为long比int类型大,会发生自动转换

  9. SpringMVC关于json、xml自动转换的原理研究[附带源码分析]

    目录 前言 现象 源码分析 实例讲解 关于配置 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.c ...

  10. springMVC注解@initbinder日期类型的属性自动转换

    在实际操作中经常会碰到表单中的日期 字符串和Javabean中的日期类型的属性自动转换, 而springMVC默认不支持这个格式的转换,所以必须要手动配置, 自定义数据类型的绑定才能实现这个功能. 一 ...

随机推荐

  1. 通过 GitHub Actions 实现代码的自动编译和发布

    GitHub Actions 是一个非常强大的工具,可以用来实现各种自动化任务,包括自动编译和发布 release.以下是一个基本的工作流程,展示如何使用 GitHub Actions 实现这一目标: ...

  2. 反转字符串II(541)

    题目描述 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符. 如果剩余字符少于 k 个,则将剩余字符全部反转. 如果剩余字符小于 2 ...

  3. vue自定义组件的点击事件失效

    在vue开发过程中为了减少重复代码,很多时候都需要将重复的部分写成一个组件,方便调用.但是使用组件时很可能又会给该组件添加点击事件.如果直接这样写,事件则会失效: 正确写法应该是这样:

  4. Coursera self-driving2, State Estimation and Localization Week4, LIDAR

    operating principles 工作原理 Velodyne 加州,Hokuyo 日本,SICK 德国 TOF 就是用发出去收到的时间差和光速算距离 basic LIDAR models (2 ...

  5. 万字长文带你窥探Spring中所有的扩展点

    写在前面 Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片.Springboot更是封装了Spring,遵循约定大于配置,加上自动装配 ...

  6. 用 SQL 写的俄罗斯方块游戏「GitHub 热点速览」

    在开始介绍上周热门开源项目之前,要插播一条开源新闻:Nginx 已正式迁移至 GitHub. 近日,Nginx 官方宣布将 Nginx 开源项目,从 Mercurial 迁移至 GitHub 代码托管 ...

  7. Google Analytics – GA4 & Tag Manager 概念篇

    前言 当我们设计好网站或者 App 后, 我们要怎样知道这个产品用户是否满意呢? 如果发掘潜在的提升空间呢? 等用户反馈? 投诉? 显然不是上策, 更好的方式是观察. 身为一个产品经理, 我只要看着你 ...

  8. JavaScript – Rest Parameters & Spread Operator

    介绍 Rest 和 Spread 的共同点是语法都是 ... (点点点). 但它们的概念是相反的. 看例子体会: Rest Parameters 参考: 阮一峰 – rest 参数 rest para ...

  9. nRF24L01芯片驱动记录

    nRF24L01芯片驱动记录 ​ 学习完了usb,了解了部分元器件的功能以及用途后,打算在端午假期用一天的时间完成一个小目标,不过实际上是花了一天半才成功实现,现将驱动nRF24L01芯片的整个过程记 ...

  10. 自己动手,通过源码找回 Ant-Design-Blaozr 中 Tree 组件的搜索筛选效果

    最近更新一个Blazor server的项目,顺带把用到的Ant-Design-Blazor 升级到了最新的 0.14.4,结果发现之前在 0.8.4 版本中 Tree 组件的搜索显示效果变了,从仅显 ...