异构数据源DDL自动转换
当我们在不同数据库迁移、同步数据时,首先要做的就是把库和表的结构在目标端创建出来。
当我们把数据库的结构 dump 出来之后,这个 DDL 在目标端大概率是无法直接运行的,至少数据类型在不同数据库之间就不相同,有的数据类型在目标端根本不存在,有的数据类型即使存在但存储精度、存储空间完全不一样,这给数据同步工作带来了很多困难。
这是一个很常见的需求,navicat 的 data transfer
功能就可以做到这一点。但如果想把这个功能集成在自研的产品中,很遗憾 navicat 并不开源。
这件事应该并不难,在异构数据源之间迁移数据,数据类型的映射是必不可少的,只要数据类型映射准确,DDL 转换应该就是正确的。说干就干,我决定自己实现一个 DDL 转换工具。
功能特性
目前支持
MySQL
、Oracle
、PostgreSQL
和达梦
数据库之间的转换,当然同种类型数据库的转换也支持;支持 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 | 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 |
暂不支持 |
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 |
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 | 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字节) |
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。 |
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 | 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 |
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 |
不支持 |
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 的point 和polygon 类型用于存储几何数据。 |
DM
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。 |
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 类型也是为存储可变长度的大型二进制数据而设计。 |
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。 |
扩展方式
扩展方式也很灵活,按照以下步骤:
先查阅数据库支持哪些数据类型,重点关注数据类型的精度、存储限制,以免在数据同步过程中出现精度损失。准备好数据类型的映射关系,文件命名:xxx2zzz.json,例如
MySQL2Hive.json
;在
DataBaseType
类中新增支持的数据库类型:public enum DataBaseType {
MYSQL("MySQL"), ORACLE("Oracle"), POSTGRESQL("PostgreSQL"), DAMENG("DM");
}
在
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);
}
}
新增
BaseMetaDataFetcher
的扩展类XxxMetaDataFetcher
,如果新增数据库元数据信息获取方式有所区别,覆盖BaseMetaDataFetcher
中的实现,参照OracleMetaDataFetcher
类;新增
BaseDdlGenerator
的扩展类XxxDdlGenerator
,如果新增数据库的 DDL 语法有所区别,覆盖BaseDdlGenerator
中的实现,参照MySQLDdlGenerator
类;
写在最后
源码地址 https://github.com/redburning/database-ddl-transformer
如果大家使用过程中发现了问题,欢迎在 GitHub 上提 issue,提 issue 比给 star
更让我 appreciated!
大家如果还用过哪些趁手的数据同步工具,欢迎留言、讨论。
异构数据源DDL自动转换的更多相关文章
- 异构数据源海量数据交换工具-Taobao DataX 下载和使用
DataX介绍 DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesystem)之间的数据交换. 目前成熟的数据导入 ...
- SpringBoot中mybatis配置自动转换驼峰标识没有生效
mybatis提供了一个配置: #开启驼峰命名转换 mybatis.configuration.map-underscore-to-camel-case=true 使用该配置可以让mybatis自动将 ...
- DataX异构数据源离线同步工具json文件配置说明
DataX 是阿里开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).HDFS.Hive.ODPS.HBase.FTP等各种异构数据源之间稳定高效的数据同步功能 ...
- (二)JPA 连接工厂、主键生成策略、DDL自动更新
(一)JPA的快速入门 2.JPA连接工厂 通过之前的 代码 实现已经清楚的发现了整个的JPA实现步骤,但是这个步骤似乎有一些繁琐了,毕竟最终所关心的一定是EntityManager对象实例,而要想获 ...
- [占位-未完成]scikit-learn一般实例之十一:异构数据源的特征联合
[占位-未完成]scikit-learn一般实例之十一:异构数据源的特征联合 Datasets can often contain components of that require differe ...
- Struts2 OGNL 自动转换Date类型的一些注意事项
Strut2 有比较完善的使用OGNL的jsp标签自动转化为对应的后台对象的功能. 这里java.util.Date的自动转化有一些需要注意的地方(局部转换): 1.必须要在struts的xml文件中 ...
- PHP是弱类型语言,自动转换,强制转换
强制转换: (int) - 转换成整型 (bool) - 转换.成布尔型 (float) - 转换成浮点型 (string) - 转换成字符串 (array) - 转换成数组 (object) - 转 ...
- long l=88;这个表达式是正确的,因为long比int类型大,会发生自动转换
long l=88;这个表达式是正确的,因为long比int类型大,会发生自动转换
- SpringMVC关于json、xml自动转换的原理研究[附带源码分析]
目录 前言 现象 源码分析 实例讲解 关于配置 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.c ...
- springMVC注解@initbinder日期类型的属性自动转换
在实际操作中经常会碰到表单中的日期 字符串和Javabean中的日期类型的属性自动转换, 而springMVC默认不支持这个格式的转换,所以必须要手动配置, 自定义数据类型的绑定才能实现这个功能. 一 ...
随机推荐
- 全网最适合入门的面向对象编程教程:39 Python常用复合数据类型-集合
全网最适合入门的面向对象编程教程:39 Python 常用复合数据类型-集合 摘要: 在 Python 中,集合(set)是一种常用的复合数据类型.集合是一组无序且不重复的元素.与列表和元组不同,集合 ...
- SAR靶机笔记
SAR 靶机笔记 概述 SAR 是 Vulnhub 上的靶机,大家可以去 vulnhub 网站上去进行下载. 这里有链接: https://download.vulnhub.com/sar/sar.z ...
- 怎样防止浏览器自动将http网址转变为https
Chrome 浏览器 地址栏中输入 chrome://net-internals/#hsts 在 Delete domain security policies 中输入项目的域名,并 Delete 删 ...
- docker高级篇第二章-分布式存储之实战案例:主从容错切换迁移案例
在上一篇,学会了3主3从的Redis集群搭建.那么接下来,我们就来学习Redis集群主从容错切换迁移案例 本次案例从模拟两个场景 1:数据读写存储 a:一个新key数据来了,是否会按照预设的进入槽中? ...
- Seata 1.3.0 ERROR i.s.c.r.n.NettyClientChannelManager -no available service 'null' found, please make sure registry config correct
根据个人经验,报这个错误是因为nacos里并没有同步seata的config导致的 配置文档:https://www.bookstack.cn/read/seata-1.3.0/4b2f4de4831 ...
- Android 国际化:新增越南语语系(Java)
前提: 1. 在res文件夹中,新增values-vi文件夹(越南语文件夹) 2. 在步骤1的文件夹中,新增strings.xml 背景: 1. targetSdkVersion 29 2. Jdk ...
- SQL Server磁盘空间清理 【转】
SQL Server在删除数据后,会重新利用这部分空间,所以如果不是空间紧张的情况下,可以不回收.回收一般先回收日志文件,因为这个回收速度非常快,可以短时间内清理出一部分可用空间.回收步骤: 1.查看 ...
- Locust 进行分布式负载测试
什么是 Locust Locust 是一个开源的负载测试工具,用于测试网站和其他应用程序的性能.它通过编写 Python 脚本来定义虚拟用户的行为,模拟这些用户对目标系统发起请求.Locust 提供了 ...
- BOM – Navigator SendBeacon
介绍 游览器专门做给 tracking 用的接口. 从前我们想 tracking 用户点击 anchor 是比较麻烦的. 因为 click 事件触发后, 想发 ajxax 去做 tracking re ...
- 更新预警(bushi)
一回首,上次更新已经是将近3个月前了.但是博主不是似了,也不是逍遥快活游山玩水纸醉金迷乐不思蜀,而是上班太忙还是单休,所以没什么时间更新博客.但是今天我要开始忏悔了!预计更新以下几个专题(不一定真的会 ...