IBM® Migration Toolkit 增加了一些帮助把数据从 MySQL 迁移到 Informix® Dynamic Server 的新功能。在本文中,学习如何使用这个工具集帮助迁移 DDL 和 DML 语句,了解如何映射数据类型。
MySQL 迁移支持 在 2007 年初,IBM Migration Toolkit 2.0.2.0(MTK)实现了对从 MySQL 4.x 和 5.x 迁移到 Informix Dynamic Server(IDS)目标的有限支持。后续的 MTK 版本改进了最初的支持。改进的支持包括迁移某些 DDL 和 DML 语句。 MTK 支持对以下 MySQL SQL 语句的完全转换: - CREATE TABLE 语句
- CREATE INDEX 语句
MTK 还在很大程度上支持以下 MySQL SQL 语句: - INSERT 语句
- ALTER TABLE 语句
- DROP TABLE 语句
- SELECT 语句
- DELETE 语句
- UPDATE 语句
从 MySQL 到 IDS 的迁移支持只适用于 Informix Dynamic Server Version 7、9.4、10 或更高版本。 MTK 支持以下 MySQL SQL 语句的完全转换: CREATE TABLE 语句 CREATE INDEX 语句 MTK 还在很大程度上支持以下 MySQL SQL 语句: INSERT 语句 ALTER TABLE 语句 DROP TABLE 语句 SELECT 语句 DELETE 语句 UPDATE 语句 CREATE TABLE 语句
对 create table 语句的支持与对 DB2 的支持相似。惟一的差异是映射到的 IDS 数据类型和 IDS 等效语法。本文讲解 MySQL 语法到 DB2 等效语法的 MTK 转换。 表 2 解释了 MySQL 数据类型如何映射到 IDS 数据类型。还指出了特定数据类型的可选映射。 表 2. 数据类型映射
| MySQL 数据类型 | IDS 数据类型 |
|---|
| TINYINT | SMALLINT |
|---|
| SMALLINT | SMALLINT |
|---|
| MEDIUMINT | INTEGER |
|---|
| INT | INTEGER |
|---|
| INTEGER | INTEGER |
|---|
| BIGINT | INT8 |
|---|
| REAL | DOUBLE PRECISION |
|---|
| DOUBLE | DOUBLE PRECISION |
|---|
| FLOAT | DOUBLE PRECISION |
|---|
DECIMAL(p,s)
其中: s > 0 && p >= s s > 0 && p < s s < 0 |
DECIMAL(min(p,32), min(s,32)) DECIMAL(min(p,32), min(s,32)) DECIMAL(min(p,32),0) |
|---|
NUMERIC(p,s)
其中: s > 0 && p >= s s > 0 && p < s s < 0 |
DECIMAL(min(p,32), min(s,32)) DECIMAL(min(p,32), min(s,32)) DECIMAL(min(p,32),0) |
|---|
| TINYINT UNSIGNED | SMALLINT |
|---|
| SMALLINT UNSIGNED | INTEGER
可选: SMALLINT |
|---|
| MEDIUMINT UNSIGNED | INTEGER |
|---|
| INT UNSIGNED | INT8
可选: INTEGER |
|---|
| BIGINT UNSIGNED | DECIMAL(20,0)
可选: INT8 |
|---|
| REAL UNSIGNED | DOUBLE PRECISION |
|---|
| DOUBLE UNSIGNED | DECIMAL(p,s)
可选: DOUBLE PRECESION |
|---|
| FLOAT UNSIGNED | DOUBLE PRECISION |
|---|
| DECIMAL UNSIGNED | DECIMAL(p,s) |
|---|
| NUMERIC UNSIGNED | DECIMAL(p,s) |
|---|
| DATE | DATE |
|---|
| TIME | DATETIME HOUR TO FRACTION |
|---|
| TIMESTAMP | DATETIME YEAR TO FRACTION |
|---|
| DATETIME | DATETIME YEAR TO FRACTION
可选: DATE |
|---|
| YEAR | CHAR(4) |
|---|
| CHAR(l) | CHAR(l) |
|---|
| VARCHAR(l) | VARCHAR(l)
可选: LVARCHAR 可选: CLOB |
|---|
| TINYBLOB | BYTE
可选: BLOB |
|---|
| BLOB | BLOB
可选: BYTE |
|---|
| MEDIUMBLOB | BYTE
可选: BLOB |
|---|
| LONGBLOB | BYTE
可选: BLOB |
|---|
| TINYTEXT | TEXT |
|---|
| TEXT | TEXT |
|---|
| MEDIUMTEXT | TEXT |
|---|
| LONGTEXT | TEXT |
|---|
清单 7 说明 MySQL 数据类型和 CREATE TABLE 语句如何转换为 IDS 语法: 清单 7a. MySQL SQL - CREATE TABLE CREATE TABLE tab7( col1 CHAR(20), col2 VARCHAR(30), col3 SMALLINT(20), col4 TINYINT(30), col5 MEDIUMINT(20), col6 INT(10), col7 INTEGER(20), col8 BIGINT(20), col9 REAL, col10 DOUBLE, col11 FLOAT, col12 DECIMAL(10,4), col13 NUMERIC(10,4), col14 DATE, col15 TIME, col16 TIMESTAMP, col17 DATETIME, col18 YEAR, col19 BIT );
清单 7b. MTK 转换 - CREATE TABLE(IDS)
CREATE TABLE tab7( col1 CHAR(20), col2 VARCHAR(30), col3 SMALLINT, col4 SMALLINT, col5 INTEGER, col6 INTEGER, col7 INTEGER, col8 INT8, col9 DOUBLE PRECISION, col10 DOUBLE PRECISION, col11 DOUBLE PRECISION, col12 DECIMAL(10,4), col13 DECIMAL(10,4), col14 DATE, col15 DATETIME HOUR TO FRACTION (5), col16 DATETIME YEAR TO FRACTION (5), col17 DATETIME YEAR TO FRACTION (5), col18 CHAR(4), col19 SMALLINT ); 清单 8 是一个把约束转换为 IDS 语法的示例。 清单 8a. MySQL SQL - 约束 CREATE TABLE tab8 ( col1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP, col2 SMALLINT );
CREATE TABLE unq( c1 INTEGER, c2 CHAR(10), CONSTRAINT ccc UNIQUE KEY(c1) ); 清单 8b. MTK 转换 - IDS 中的约束 CREATE TABLE tab8( col1 DATETIME YEAR TO FRACTION (5) DEFAULT CURRENT YEAR TO FRACTION (5), col2 SMALLINT );
CREATE TABLE unq( c1 INTEGER, c2 CHAR(10), UNIQUE(c1) CONSTRAINT ccc ); CREATE INDEX 语句 清单 9 给出 CREATE INDEX 语句支持和 MTK 转换的示例。 清单 9a. MySQL SQL - 创建惟一索引 CREATE TABLE tab9 ( col1 INT, col2 FLOAT );
CREATE UNIQUE INDEX idx1 ON tab9(col1 ASC); 清单 9b. MTK 转换 - 创建惟一索引 CREATE TABLE tab9( col1 INTEGER, col2 DOUBLE PRECISION );
CREATE UNIQUE INDEX idx1 ON tab9(col1 ASC); INSERT 语句 IDS 不支持带多个 VALUE 子句的 INSERT 语句。因此,如果选择 IDS 作为目标,MTK 不会转换 MySQL 中的这些语句。目前,这个 MySQL INSERT 语句需要手工转换。 在下面的示例中,MTK 会生成一个警告并忽略 SQL INSERT 语句。 清单 10a. MySQL SQL - 带多个 VALUE 子句的 INSERT CREATE TABLE tab10( c1 INT, c2 CHAR(1) );
INSERT INTO tab1 VALUES (1,'A'),(2,'B'),(3,'C'); 清单 10b. MTK 转换 - 带多个 VALUE 子句的 INSERT CREATE TABLE tab10( c1 INTEGER, c2 CHAR(1) );
--* [600292]"insert.sql"(2:2)-(2:49)Ignored the multiple INSERT statement because Informix Dynamic Server does not support it. 注意:前面在讨论 DB2 迁移时提到的其他 INSERT 语法在 IDS 迁移期间也是支持的。 结束语
通过使用 MTK 2.0.2.0 和后续 MTK 版本中的改进,我们现在可以转换许多 MySQL DDL 和 DML 语句。MTK 2.0.2.0 和后续 MTK 版本使 MySQL 数据库迁移更加轻松、灵活和强大。更多信息和示例参见 MTK 文档。 |