今天在用Kettle做数据迁移的时候遇到一个问题,通过Kettle把从SQL Server的源数据导入到Oracle数据库中出现很多问题,也就是因为表信息不一致造成数据无法导入。源数据库SQL Server因为表比较复杂,就直接从SQL Server Mangement Studio手动方式导出建表的SQL语句,具体过程是:选择需要查看的表->右键“编写表脚本为”->CREATE到->文件,这个时候会弹出一个目录保存建表语句内容。目的数据库中需要创建一份一致的表结构,方便从源数据库中加载数据过来。
我们都知道虽然SQL Server和Oracle都支持标准的SQL语句,但是每家厂商的支持方式是有差异的,并不完全一直,而且两家厂商的SQL语句是不可以共用的,这个时候如果要完成数据表的迁移就需要修改建表语句,以支持Kettle可以无障碍迁移数据,特别是两者的数据类型差异还是很大的,所以笔者基于此整理了一份两者差异对比表,供读者查询使用。
SQL Server 数据类型 | Oracle 数据类型 |
---|---|
bigint | NUMBER(19,0) |
binary(1-2000) | RAW(1-2000) |
binary(2001-8000) | BLOB |
bit | NUMBER(1) |
char(1-2000) | CHAR(1-2000) |
char(2001-4000) | VARCHAR2(2001-4000) |
char(4001-8000) | CLOB |
date | DATE |
datetime | DATE |
datetime2(0-7) | TIMESTAMP(7)(对于 Oracle 9 和 Oracle 10);VARCHAR(27)(对于 Oracle 8) |
datetimeoffset(0-7) | TIMESTAMP(7) WITH TIME ZONE(对于 Oracle 9 和 Oracle 10);VARCHAR(34)(对于 Oracle 8) |
decimal(1-38, 0-38) | NUMBER(1-38, 0-38) |
float(53) | FLOAT |
float | FLOAT |
地理 | BLOB |
geometry | BLOB |
hierarchyid | BLOB |
图像 | BLOB |
int | NUMBER(10,0) |
money | NUMBER(19,4) |
nchar(1-1000) | CHAR(1-1000) |
nchar(1001-4000) | NCLOB |
ntext | NCLOB |
numeric(1-38, 0-38) | NUMBER(1-38, 0-38) |
nvarchar(1-1000) | VARCHAR2(1-2000) |
nvarchar(1001-4000) | NCLOB |
nvarchar(max) | NCLOB |
real | real |
smalldatetime | DATE |
int | NUMBER(5,0) |
smallmoney | NUMBER(10,4) |
sql_variant | N/A |
sysname | VARCHAR2(128) |
text | CLOB |
time(0-7) | VARCHAR(16) |
timestamp | RAW(8) |
tinyint | NUMBER(3,0) |
uniqueidentifier | CHAR(38) |
varbinary(1-2000) | RAW(1-2000) |
varbinary(2001-8000) | BLOB |
varchar(1-4000) | VARCHAR2(1-4000) |
varchar(4001-8000) | CLOB |
varbinary(max) | BLOB |
varchar(max) | CLOB |
xml | NCLOB |
项目使用的MSSQL的sql文件和最终转成ORACLE的sql文件,可以通过Github访问,访问地址如下:
Github代码访问
声明: 本文数据类型比对表非笔者原创,主要引用自笨笨鱼~的博客文章Oracle和sqlserver数据类型对应
参考文献