不同类型的数据库(异构数据库)支持的数据类型不一样,DTS在进行异构数据库之间的数据迁移时,会在结构迁移阶段进行数据类型映射,即将源库中的数据类型转为目标库支持的数据类型。本文为您列出详细数据类型映射关系,便于您查阅和评估数据迁移对业务的影响。

概览

根据如下迁移方案,查看异构数据库间的数据类型映射关系:
重要 若源端时间字段的数据类型为TIMESTAMP WITH TIME ZONE,目标端时间字段的数据类型为DATETIME等异构数据类型,时间字段的时区信息将会丢失。

以PolarDB MySQL、RDS MySQL、自建MySQL为源的数据迁移

当源实例为PolarDB MySQL、RDS MySQL、自建MySQL,且目标实例为异构数据库时(包括云原生数据仓库AnalyticDB MySQL版 3.0和2.0、云原生数据仓库AnalyticDB PostgreSQL版),两者间的数据类型映射关系如下:
说明 如源实例中待迁移数据范围超出DTS所支持的范围,则会导致目标实例中的所迁入数据的精度降低。
类型 源实例的数据类型 数值范围 云原生数据仓库AnalyticDB MySQL版 3.0的数据类型 云原生数据仓库AnalyticDB MySQL版 2.0的数据类型 云原生数据仓库AnalyticDB PostgreSQL版的数据类型 阿里云消息队列Kafka、自建Kafka的数据类型
整数类型 BIT[(M)] 1 ~ 64 VARCHAR INT BIT 与MySQL、PolarDB MySQL的数据类型保持一致
TINYINT[(M)] -128 ~ 127 TINYINT TINYINT SMALLINT
TINYINT[(M)] [UNSIGNED] 0 ~ 255 SMALLINT SMALLINT SMALLINT
SMALLINT[(M)] -32768 ~ 32767 SMALLINT SMALLINT SMALLINT
SMALLINT[(M)] [UNSIGNED] 0 ~ 65535 INT INT INTEGER
MEDIUMINT[(M)] -8388608 ~ 8388607 INT INT INTEGER
MEDIUMINT[(M)] [UNSIGNED] 0 ~ 16777215 INT INT INTEGER
INT[(M)] -2147483648 ~ 2147483647 INT INT INTEGER
INT[(M)] [UNSIGNED] 0 ~ 4294967295 BIGINT BIGINT BIGINT
BIGINT[(M)] -9223372036854775808 ~ 9223372036854775807 BIGINT BIGINT BIGINT
BIGINT[(M)] [UNSIGNED] 0 ~ 18446744073709551615. DECIMAL(20,0) BIGINT NUMERIC(20)
小数类型 DECIMAL[(M[,D])] M:0~65 ;
D:0~30
DECIMAL[(M[,D])] DECIMAL[(M[,D])] DECIMAL
FLOAT(p) 1.175494351E-38 ~ 3.402823466E+38 FLOAT FLOAT REAL
DOUBLE[(M,D)] 2.2250738585072014E-308 ~ 1.7976931348623157E+308 DOUBLE DOUBLE DOUBLE PRECISION
时间类型 DATE 1000-01-01~9999-12-31
说明 格式为YYYY-MM-DD(UTC时间)。
DATE DATE DATE
DATETIME[(fsp)] 1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.999999
说明 格式为YYYY-MM-DD hh:mm:ss[.fraction](UTC时间)。
DATETIME TIMESTAMP TIMESTAMP
TIMESTAMP[(fsp)] 1970-01-01 00:00:01.000000 ~ 2038-01-19 03:14:07.999999
说明 格式为YYYY-MM-DD hh:mm:ss[.fraction](UTC时间)。
TIMESTAMP TIMESTAMP TIMESTAMP WITH TIME ZONE
TIME[(fsp)] -838:59:59.000000 ~ 838:59:59.000000
说明 格式为hh:mm:ss[.fraction](UTC时间)。
TIME VARCHAR TIME
YEAR[(4)] 1901 ~ 2155,或0000. INT VARCHAR INTEGER
字符串类型 CHAR[(M)] 0 ~ 255 字符 VARCHAR VARCHAR CHAR
VARCHAR(M) 0 ~ 65,535 字符 VARCHAR VARCHAR VARCHAR
BINARY[(M)] 0 ~ 255 字节 VARBINARY VARCHAR BYTEA
VARBINARY(M) 0 ~ 65,535 字节 VARBINARY VARCHAR BYTEA
TINYBLOB 255 (2^8 - 1) 字节 VARBINARY VARCHAR BYTEA
TINYTEXT 255 (2^8 - 1) 字符 VARCHAR VARCHAR TEXT
BLOB 65,535 (2^16 - 1) 字节 VARBINARY VARCHAR BYTEA
TEXT 65,535 (2^16 - 1) 字符 VARCHAR VARCHAR TEXT
MEDIUMBLOB 16,777,215 (2^24 - 1) 字节 VARBINARY VARCHAR BYTEA
MEDIUMTEXT 16,777,215 (2^24 - 1) 字符 VARCHAR VARCHAR TEXT
LONGBLOB 4,294,967,295 or 4GB (2^32 - 1) 字节 VARBINARY VARCHAR BYTEA
LONGTEXT 4,294,967,295 or 4GB (2^32 - 1) 字符 VARCHAR VARCHAR TEXT
ENUM('value1','value2',...) 最多可包含65,535枚举值 VARCHAR VARCHAR VARCHAR(128)
SET('value1','value2',...) 最多可包含64个元素 VARCHAR VARCHAR VARCHAR(128)
空间类型 GEOMETRY 任意几何类型的值 VARBINARY VARCHAR POLYGON
POINT VARBINARY VARCHAR POINT
LINESTRING VARBINARY VARCHAR PATH
POLYGON VARBINARY VARCHAR POLYGON
MULTIPOINT VARBINARY VARCHAR POLYGON
MULTILINESTRING VARBINARY VARCHAR PATH
MULTIPOLYGON VARBINARY VARCHAR POLYGON
GEOMETRYCOLLECTION 任何几何类型的值的集合 VARBINARY VARCHAR POLYGON
JSON类型 JSON JSON VARCHAR JSON

以Oracle为源的数据迁移

当源实例为自建Oracle,且目标实例为异构数据库时(包括MySQL、PolarDB MySQL、云原生数据仓库AnalyticDB MySQL版 3.0、云原生数据仓库AnalyticDB PostgreSQL版、PolarDB O引擎),两者间的数据类型映射关系如下:
说明 如源实例中待迁移数据范围超出DTS所支持的范围,则会导致目标实例中的所迁入数据的精度降低。
类型 Oracle的数据类型 数值范围 MySQL、PolarDB MySQL、PolarDB-X的数据类型 RDS PPAS的数据类型 云原生数据仓库AnalyticDB MySQL版 3.0的数据类型 云原生数据仓库AnalyticDB PostgreSQL版的数据类型 PolarDB O引擎的数据类型
数字类型 NUMBER(p,s) 1 ~ 22 字节。
p代表精度位,取值范围是1 ~ 38。
s代表小数位,取值范围是-84 ~ 127。
DECIMAL[(p[,s])] NUMBER[(p[,s])] DECIMAL | TINYINT | SMALLINT | INTEGER | BIGINT DECIMAL | TINYINT | SMALLINT | INTEGER | BIGINT NUMBER(p,s)
FLOAT(p) 1 ~ 22 字节。
p代表指针变量,取值范围是1 ~ 126 bit。
DOUBLE DOUBLE PRECISION DOUBLE DOUBLE PRECISION DOUBLE PRECISION
BINARY_FLOAT 32-bit的浮点数,即4字节。 DECIMAL(65,8) REAL DOUBLE DOUBLE PRECISION REAL
BINARY_DOUBLE 64-bit的浮点数,即8字节。 DOUBLE DOUBLE PRECISION DOUBLE DOUBLE PRECISION DOUBLE PRECISION
日期类型 DATE DATETIME DATE DATETIME TIMESTAMP(0) DATE
TIMESTAMP [(fractional_seconds_precision)] DATETIME[(fractional_seconds_precision)] TIMESTAMP [(fractional_seconds_precision)] DATETIME TIMESTAMP TIMESTAMP [(fractional_seconds_precision)]
TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE DATETIME[(fractional_seconds_precision)] TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE TIMESTAMP TIMESTAMP WITH TIME ZONE TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE
TIMESTAMP [(fractional_seconds_precision)] WITH LOCAL TIME ZONE DATETIME[(fractional_seconds_precision)] TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE DATETIME TIMESTAMP WITH TIME ZONE TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE
INTERVAL YEAR [(year_precision)] TO MONTH 不支持 不支持 VARCHAR VARCHAR(32) INTERVAL
INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds_precision)] 不支持 不支持 VARCHAR VARCHAR(32) INTERVAL
字符串类型 CHAR [(size [BYTE | CHAR])] 2000 字节。 CHAR[(n)] CHAR[(n)] VARCHAR CHAR CHAR [(size [BYTE | CHAR])]
NCHAR[(size)] 2000 字节。 NATIONAL CHAR[(n)] NCHAR[(n)] VARCHAR VARCHAR NCHAR[(size)]
VARCHAR2(size [BYTE | CHAR]) 当MAX_STRING_SIZE = EXTENDED时,最大长度为32767字节;
当MAX_STRING_SIZE = STANDARD,最大长度为4000字节。
VARCHAR(n) VARCHAR2[(n)] VARCHAR VARCHAR VARCHAR2(size [BYTE | CHAR])
NVARCHAR2(size) 当MAX_STRING_SIZE = EXTENDED时,最大长度为32767字节;
当MAX_STRING_SIZE = STANDARD,最大长度为4000字节。
NATIONALVARCHAR[(n)] VARCHAR2[(n)] VARCHAR VARCHAR NVARCHAR2(size)
LONG 最大长度2G(2^31-1)。 LONGTEXT LONG VARCHAR TEXT LONG
RAW(size) 最大长度32767 字节或2000字节。 VARBINARY(2000) RAW(size) VARBINARY BYTEA RAW(size)
LONG RAW 最大长度2G。 LONGBLOB LONG RAW VARBINARY BYTEA LONG RAW
CLOB 最大长度(4 GB - 1)*DB_BLOCK_SIZE。 LONGTEXT CLOB VARCHAR TEXT CLOB
NCLOB 最大长度(4 GB - 1)*DB_BLOCK_SIZE。 LONGTEXT NCLOB VARCHAR TEXT CLOB
BLOB 最大长度(4 GB - 1)*DB_BLOCK_SIZE。 LONGBLOB BLOB VARBINARY BYTEA BLOB
BFILE 4G。 不支持 不支持 不支持 不支持 不支持
JSON类型 JSON 最大长度32MB。 不支持 不支持 JSON JSON JSON
ROWID类型 ROWID 64字符。 不支持 不支持 ROWID OID VARCHAR
空间类型 需要自定义 不支持
说明
  • 当目标实例为MySQL、PolarDB MySQL、PolarDB-X时:
    • 对于CHAR类型,如长度定义超过255,DTS会将类型转换为VARCHAR(n)。
    • 由于MySQL本身不支持类似Oracle中的BFILE、INTERVAL YEARTO MONTH和INTERVAL DAYTO SECOND数据类型,DTS在进行结构迁移时,无法在MySQL中找到合适的数据类型进行映射,因此这三种类型不会进行转化。

      迁移时如果表中含有这三种类型,会导致结构迁移失败,在选择迁移对象时,对需要迁移的对象中这三种类型的列进行排除。

    • 由于MySQL的TIMESTAMP类型不包含时区,而Oracle的TIMESTAMP WITH TIME ZONE和TIMESTAMP WITH LOCAL TIME ZONE默认带有时区信息,DTS在迁移这两种类型的数据时,会将其转换成UTC时区后存入目标实例。
  • 当目标实例为RDS PPAS时,

    由于RDS PPAS不支持TIMESTAMP[(fractional_seconds_precision)] WITH LOCAL TIME ZONE,DTS在迁移这种类型的数据时,会将其转换成UTC时区后存入目标RDS PPAS的TIMESTAMP[(fractional_seconds_precision)] WITH TIME ZONE中。

  • 当目标实例为云原生数据仓库AnalyticDB PostgreSQL版时,

    对于云原生数据仓库AnalyticDB PostgreSQL版不支持字段类型,DTS会将其直接转为BYTEA,如果转换不了则将数据内容置为NULL。

以SQL Server为源的数据迁移

当源实例为SQL Server(包括自建SQL Server、RDS SQL Server),且目标实例为异构数据库时(包括云原生数据仓库AnalyticDB MySQL版 3.0、云原生数据仓库AnalyticDB PostgreSQL版),两者间的数据类型映射关系如下:
说明 如源实例中待迁移数据范围超出DTS所支持的范围,则会导致目标实例中的所迁入数据的精度降低。
类型 SQL Server的数据类型 数值范围 云原生数据仓库AnalyticDB MySQL版 3.0的数据类型 云原生数据仓库AnalyticDB PostgreSQL版的数据类型
整数类型 BIT 可以取值为1、0或NULL的INTEGER数据类型 BOOLEAN BIT(1)
TINYINT 0至255 TINYINT SMALLINT
SMALLINT -2^15(-32768)至2^15-1(32767) SMALLINT SMALLINT
INT -2^31(-2147483648)至2^31-1(2147483647) INTEGER INTEGER
BIGINT -2^63(-9223372036854775808)至2^63-1(9223372036854775807) BIGINT BIGINT
小数类型 NUMERIC[ (p[ ,s] )] -10^38+1至10^38-1; 1<=p<=38 DECIMAL DECIMAL
DECIMAL[ (p[ ,s] )] -10^38+1至10^38-1; 1<= p<=38 DECIMAL DECIMAL
FLOAT -1.79E+308至-2.23E -308、0 以及2.23E-308至1.79E+308 DOUBLE DOUBLE PRECISION
REAL -3.40E+38至-1.18E- 38、0 以及1.18E-38至3.40E +38 FLOAT REAL
货币类型 MONEY -922,337,203,685,477.5808至922,337,203,685,477.5807 DECIMAL(19, 4) DECIMAL(19, 4)
SMALLMONEY -214,748.3648至214,748.3647 DECIMAL(10, 4) DECIMAL(10, 4)
日期类型 DATE 0001-01-01至9999-12-31 DATE DATE
DATETIME 日期范围为1753年1月1日至9999年12月31日;
时间范围为00:00:00至 23:59:59.997
DATETIME TIMESTAMP(3) WITHOUT TIME ZONE
DATETIME2[ (fractional seconds precision) ] 日期范围为公元1年1月1日至公元9999年12月31日;
时间范围为00:00:00至23:59:59.9999999
DATETIME TIMESTAMP(7) WITHOUT TIME ZONE
DATETIMEOFFSET [ (fractional seconds precision) ] 日期范围公元1年1月1日至公元9999年12月31日;
时间范围为00:00:00至 23:59:59.9999999;
时区偏移量范围-14:00至+14:00
TIMESTAMP TIMESTAMP(7) WITH TIME ZONE
SMALLDATETIME 秒始终为零 (:00),并且不带秒小数部分 DATETIME TIMESTAMP WITHOUT TIME ZONE
TIME [ (fractional second scale) ] 00:00:00.0000000至23:59:59.9999999 TIME TIME(7) WITH TIME ZONE
字符串类型 BINARY [ ( n ) ] n取值范围为1~8,000 VARBINARY BYTEA
VARBINARY [ ( n | max) ] n取值范围为1~8,000;max代表最大存储大小是2^31-1 个字节 VARBINARY BYTEA
CHAR [ ( n ) ] n取值范围为1~8,000,存储大小为n个字节 VARCHAR CHARACTER
VARCHAR [ ( n | max ) ] n取值范围为1~8,000;max代表最大存储大小是 2^31-1 个字节(2GB) VARCHAR CHARACTER
NCHAR [ ( n ) ] 以双字节为单位,n 取值范围为1至4,000,存储大小为 n字节的两倍 VARCHAR CHARACTER VARYING
NVARCHAR [ ( n | max ) ] 以双字节为单位,n取值范围为1至4,000,max代表最大存储大小是2^30-1个字符(2 GB) VARCHAR CHARACTER VARYING
NTEXT 长度可变的Unicode 数据,字符串最大长度为2^30-1(1073741823)个字节 VARCHAR TEXT
TEXT 字符串最大长度为2^31-1(2147483647)个字节 VARCHAR TEXT
IMAGE 长度可变的二进制数据,从0到2^31-1 (2147483647)个字节。 VARBINARY BYTEA
空间和几何类型 GEOGRAPHY VARCHAR 不支持
GEOMETRY VARCHAR 不支持
XML类型 XML ( [ CONTENT | DOCUMENT ] xml_schema_collection ) VARCHAR XML
其它类型 UNIQUEIDENTIFIER VARCHAR CHARACTER(36)
SQL_VARIANT 不支持 不支持
HIERARCHYID 不支持 不支持
SYSNAME VARCHAR CHARACTER VARYING(128)

以自建TiDB为源的数据迁移

当源实例为自建TiDB,且目标实例为异构数据库时(如MySQL),两者间的数据类型映射关系如下:
TiDB数据类型 MySQL的数据类型
BIGINT BIGINT
BINARY BINARY
BIT BIT
BOOL\ BOOLEAN TINYINT
CHAR CHAR
DATE DATE
DATETIME DATETIME
DECIMAL DECIMAL
DOUBLE DOUBLE
ENUM ENUM
FLOAT FLOAT
INT INT
INTEGER INTEGER
JSON JSON

MEDIUMBLOB/LONGBLOB

TINYBLOB/BLOB/

MEDIUMBLOB/LONGBLOB

TINYBLOB/BLOB/

MEDIUMINT MEDIUMINT
SET SET
SMALLINT SMALLINT
TEXT/LONGTEXT TEXT/LONGTEXT
TIME TIME
TIMESTAMP TIMESTAMP
TINYINT TINYINT
VARBINARY VARBINARY
VARCHAR VARCHAR
YEAR YEAR

以DB2 for LUW为源的数据迁移

当源实例为DB2 for LUW,且目标实例为异构数据库时(包括MySQL),两者间的数据类型映射关系如下:
说明 如源实例中待迁移数据范围超出DTS所支持的范围,则会导致目标实例中的所迁入数据的精度降低。
类型 DB2 for LUW数据类型 数值范围 MySQL的数据类型
整数类型 SMALLINT -32,768~+32,767 SMALLINT
INTEGER -2,147,483,648~+2,147,483,647 INT
BIGINT -9,223,372,036,854,775,808~ +9,223,372,036,854,775,807 BIGINT
小数类型 DECIMAL(precision-integer, scale-integer) p<=38 DECIMAL
FLOAT(integer) 取值范围为1~53,取值在1~24表示为单精度,取值在25~53表示为双精度 FLOAT
DECFLOAT(precision-integer) DECIMAL(65,10)
日期类型 DATE 0001-01-01~9999-12-31 DATE
TIME 00:00:00~24:00:00 TIME
TIMESTAMP(integer) 0001-01-01-00.00.00.000000000000~9999-12-31-24.00.00.000000000000;0<=p<= 12 DATETIME
字符串类型 CHARACTER(integer) 254 CHAR | VARCHAR
VARCHAR(integer) 32,672 VARCHAR
CHARACTER(integer) FOR BIT DATA 254 BLOB
CLOB 2,147,483,647 LONGTEXT
GRAPHIC(integer) 127 CHAR(length*4)
VARGRAPHIC(integer) 16,336 CHAR(length*4)
DBCLOB(integer) 1,073,741,823 VARCHAR | LONGTEXT
BLOB 2,147,483,647 LONGBLOB
其它类型 XML 2,147,483,647 VARCHAR | LONGTEXT

以Db2 for i为源的数据迁移

当源实例为DB2 for i,且目标实例为异构数据库时(包括MySQL),两者间的数据类型映射关系如下:
说明 如源实例中待迁移数据范围超出DTS所支持的范围,则会导致目标实例中的所迁入数据的精度降低。
类型 Db2 for i 数据类型 数值范围 MySQL中的数据类型
整数类型 SMALLINT -32,768~+32,767 SMALLINT
INTEGER -2,147,483,648~+2,147,483,647 INT
BIGINT -9,223,372,036,854,775,808~ +9,223,372,036,854,775,807 BIGINT
小数类型 DECIMAL(precision-integer, scale-integer) p<=63 DECIMAL
NUMERIC DECIMAL
FLOAT(integer) FLOAT
DECFLOAT(precision-integer) DECIMAL(65,10)
日期类型 DATE 0001-01-0~9999-12-31 DATE
TIME 00:00:00~24:00:00 TIME
TIMESTAMP(integer) 0001-01-01-00.00.00.000000000000~9999-12-31-24.00.00.000000000000;0 <=p <=12 DATETIME
字符串类型 CHAR(integer) 32,765 CHAR | VARCHAR
VARCHAR(integer) 32,739 VARCHAR
CHAR(integer) FOR BIT DATA BLOB
CLOB 2,147,483,647 LONGTEXT
GRAPHIC(integer) 16,382 CHAR
VARGRAPHIC(integer) 16,369 VARCHAR
DBCLOB(integer) 1,073,741,823 LONGTEXT
BINARY 32,765 BINARY
VARBIN 32,739 VARBINARY
BLOB 2,147,483,647 LONGBLOB
其它类型 DATALINK VARCHAR | LONGTEXT
ROWID 40 VARCHAR | LONGTEXT
XML 2,147,483,647 VARCHAR | LONGTEXT

以Teradata为源的数据迁移

当源实例为Teradata,且目标实例为异构数据库时(如云原生数据仓库AnalyticDB PostgreSQL版),两者间的数据类型映射关系如下:
Teradata数据类型 AnalyticDB PostgreSQL中的数据类型
BYTEINT SMALLINT
SMALLINT SMALLINT
BIGINT BIGINT
INTEGER INTEGER
DATE DATE
JSON JSON
XML XML
CLOB text
Float real
CHAR CHAR
VARCHAR VARCHAR
Timestamp Timestamp
TIME TIME
Timestamp With Time Zone Timestamp With Time Zone
Time With Time Zone Time With Time Zone
Decimal Decimal
Number numeric
BYTE bytea
VARBYTE bytea
BLOB bytea
PERIOD varchar(100)
INTERVAL varchar(100)
Teradata数据类型 AnalyticDB PostgreSQL中的数据类型
SMALLINT SMALLINT
INTEGER INT
BIGINT BIGINT
DECIMAL(precision-integer, scale-integer) DECIMAL
NUMERIC DECIMAL
FLOAT(integer) FLOAT
DECFLOAT(precision-integer) DECIMAL(65,10)
DATE DATE
TIME TIME
TIMESTAMP(integer) DATETIME
CHAR(integer) CHAR | VARCHAR
VARCHAR(integer) VARCHAR
CHAR(integer) FOR BIT DATA BLOB
CLOB LONGTEXT
GRAPHIC(integer) CHAR
VARGRAPHIC(integer) VARCHAR
DBCLOB(integer) LONGTEXT
BINARY BINARY
VARBIN VARBINARY
BLOB LONGBLOB
DATALINK VARCHAR | LONGTEXT
ROWID VARCHAR | LONGTEXT
XML VARCHAR | LONGTEXT