随着MySQL数据库的应用越来越广泛,从DB2迁移到MySQL数据库的需求也越来越大。在数据库之间迁移时,首先遇到的也是最基本也是最重要的就是两种数据库数据类型之间的转换。下面结合中国证监会深圳分公司开源数据库研究测试项目DB2数据库到MySQL数据库的迁移项目,来说明两种数据库数据类型的区别以及迁移过程中的一些注意事项。无论是DB2数据库还是MySQL数据库,在创建数据库表时都必须为每一列定义一个数据类型,以限制该列的取值范围。DB2数据库支持内置数据类型(built-in)和用户自定义数据类型(UDT),而MySQL数据库只支持内置数据类型。下图是MySQL数据库支持的内置数据类型:MySQL5.7支持的数据类型概述下图是DB2数据库支持的内置数据类型:DB2V9/V10支持的数据类型概述有是三类。在实际转换过程中,建议按照以下转换规则进行转换:数值字段类型(Numeric)DB2数据库和MySQL数据库的数值类型可以分为整型值和浮点型值。其中,在整型值方面,MySQL数据库的整型类型分为有符号(singed)和无符号(unsigned),因此每种类型可以有两种精度范围值;DB2数据库都是有符号的的取值只有一个精度范围。下图是两个数据库的整数类型对比表:在浮点值转换方面,基本上DB2中的基本数据类型都能在MySQL中找到对应的同名数据类型。实际测试对比发现,DB2的数值类型和MySQL中对应的数值类型基本具有相同的名称和同义词,可以轻松实现转换。日期时间字段类型(Date&Time)MySQL支持的日期时间类型(Datetime/Date/Timestamp/Time/Year)比DB2支持的日期时间类型(Date/Timestamp/Time)更加丰富。两个数据库的日期时间类型有以下异同:DB2中的Date类型和MySQL中的Date类型都占用四个字节(前两个字节是Year,第三个字节是Month,第四个字节是Day);主要区别在于DB2数据库中Year的范围是0001~9999,而MySQL中Year的范围是1000~9999。实际中可以直接转换。Timestamp类型MySQL中的Timestamp是Date/time的组合,取值范围为1970-01-0100:00:00到2037。转换可以直接从DB2中的Timestamp转换而来。时间类型MySQL中Time类型的取值范围是从“-838:59:59”到“838:59:59”(HHH:MM:SS),小时部分很大的原因是Time类型在MySQL中不仅可以表示一天中的时间(小于24小时),而且可以表示某个数据库事件消耗的时间或者两个事件之间的时间间隔(可能大于24小时,甚至是负值)。DB2中的Time类型是指一天中的时间,所以取值范围只能是“00:00:00”到“23:59:59”。其他MySQL中除了上述三种日期时间类型外,还有Datetime和Year两种特有的时间类型。Datetime类型也是日期和时间类型的组合(YYYY-MM-DDHH:MM:SS),其中Year的取值范围是1000到9999。Year类型的取值范围是1901到2155,它在实践中可以用SMALLINT或CHAR(4)代替。字符串字段类型(String)字符类型(CHAR/VARCHAR)类型无论是DB2还是MySQL,CHAR(n)和VARCHAR(n)类型分别代表定长和变长字符类型,括号中的n表示定义允许的最大字符数;这两种数据类型在DB2和MySQL中是可以互换的。但是DB2中CHAR(n)和VARCHAR(n)的一些特殊用法如CHAR(n)FORBITDATA、VARCHAR(n)FORBITDATA在MySQL中并没有很好的实现,MySQL设计了新的数据类型来实现DB2中的类似功能。在MySQL中,分别使用BINARY(n)和VARBINARY(n)代替CHAR(n)FORBITDATA和VARCHAR(n)FORBITDATA。在DB2数据库中,ForBitData子句用于修饰Char(n)和Varchar(n),限制指定字段类型存储二进制数据,一般用于存储音频数据等场合。在MySQL数据库中,没有对Char和Varchar类型的类似扩展。相反,BINARY和VARBINARY数据类型旨在存储二进制数据。大数据字段(LOB)类型DB2数据库中VARCHAR类型字段可以存储的最大字节数不超过表定义的页面大小。例如,如果一个表的页面大小(pagesize)是32KB,那么定义的VARCHAR字符的最大数目是32672个字符。截面长度;如果要存储的字节长度超过表的页大小,则需要为该字段定义一个大数据类型来存储数据。DB2中的大数据有两种类型,CLOB和BLOB,分别存储字符或二进制数据。MySQL中对大数据字段的定义更加细化,针对不同长度的大数据字段设计了不同级别的字段类型。如上图所示,DB2中的CLOB(n)和BLOB(n)这两种大数据字段类型由于定义的大小不同,对应了MySQL数据库中的八种数据类型。自增字段类型DB2在建表时只允许将表中的一个字段指定为Identity自增字段。有两种形式:Generatedalways和Generatedbydefault,表示定义的自增字段不允许人工(应用程序)干预或允许人工干预。MySQL数据库中的自增字段只需要修改为AUTO_INCREMENT即可,该字段可以手动干预。综上所述,以上主要比较了DB2数据库和MySQL数据库在基本数据类型上的一些差异。掌握和理解这些差异对于将DB2数据库迁移到MySQL数据库至关重要。为了方便对比,将两个数据库的数据类型总结如下图:
