MySQL與DB2的數據類型對比
隨著MySQL數據庫的應用越來越廣泛,DB2向MySQL數據庫的遷移需求也越來越多。進行數據庫之間遷移的時候,首先遇到的并且也是最基本最重要的就是兩種數據庫數據類型之間的轉換。
下面結合中國證券等級結算深圳分公司開源數據庫研究測試項目的DB2數據庫向MySQL數據庫遷移項目,說明兩種數據庫數據類型的差異以及遷移過程中的一些注意事項。
無論是DB2數據庫,還是MySQL數據庫,都要在創建數據庫表時為其中的每一列定義一個數據類型,用于限定該列取值范圍。DB2數據庫支持內置的數據類型(built-in)和用戶自定義的數據類型(UDT),但是MySQL數據庫只支持內置的數據類型。
下圖是MySQL數據庫支持的內置數據類型:
MySQL5.7支持數據類型總覽
下圖是DB2數據庫支持的內置數據類型:
DB2 V9/V10支持數據類型總覽
DB2數據類型轉換為MySQL數據類型,原則上可以分為三大類,在實際轉換過程建議遵從以下轉換規則進行轉換:
數值字段類型(Numeric)
DB2數據庫和MySQL數據庫的數值類型都可以分為整型數值和浮點型數值。其中在整型數值方面,MySQL數據庫的整型類型有有符號(singed)和無符號(unsigned)兩種,因此每一類型都可以有兩種精度范圍的取值;DB2數據庫則都是有符號的取值,只存在一種精度范圍。下圖是兩種數據庫的整型類型對照表:
浮點型數值轉換方面,基本上DB2中有的基本數據類型,在MySQL中能找到對應的同名數據類型。
實際測試對比發現,DB2的數值類型和MySQL中對應的數值類型基本同名同義,可以很輕松地實現轉換。
日期時間字段類型(Date &Time)
MySQL支持的日期時間類型(Datetime/Date/Timestamp/Time/Year)比DB2支持的(Date/Timestamp/Time)更豐富。
兩種數據庫在日期時間類型上存在如下異同:
Date類型
DB2和MySQL中的Date類型都占四個字節(其中前兩個字節為Year,第三個字節為Month,第四個字節為Day);主要差別是DB2數據庫中Year的范圍是0001~9999,MySQL中Year的范圍則為1000~9999。實際運用中可以直接轉換。
Timestamp類型
MySQL中的Timestamp是一個Date/time的組合體,取值范圍是從1970-01-01 00:00:00到2037年。轉換中可以直接從DB2中的Timestamp轉換而來。
Time類型
MySQL中Time類型取值范圍為從“-838:59:59”to “838:59:59”(HHH:MM:SS),小時部分非常大的原因是MySQL中Time類型不僅可以代表一天中的時間(小于24小時),而且可以代表某個數據庫事件消耗的時間或者兩個事件之間的時間間隔(可能大于24小時,甚至為負值)。
DB2中該Time類型指一天中的時間,因此取值范圍只能是從“00:00:00”到“23:59:59”。
其他
MySQL中除了上述三種日期時間類型外,還有Datetime和Year兩種特有的時間類型。Datetime類型也是date和time類型的組合體(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) FOR BIT DATA,VARCHAR(n)FOR BIT DATA在MySQL中沒有得到很好實現,取而代之的是MySQL設計了新的數據類型來實現DB2中的類似功能。MySQL中分別使用BINARY(n)和VARBINARY(n)替代CHAR(n)FOR BIT DATA 和VARCHAR(n) FOR BIT DATA。
DB2數據庫中使用For Bit Data從句修飾Char(n)和Varchar(n)限制指定的字段類型存儲二進制數據,一般用于存儲音頻數據等場合。而在MySQL數據庫中則沒有對Char和Varchar類型做類似擴展,取而代之的是設計了BINARY和VARBINARY數據類型專門存儲二進制數據。
大數據字段(LOB)類型
DB2數據庫中VARCHAR類型字段最大能存儲的字節數不超過表定義的頁大小,比如某個表的頁大小(pagesize)為32KB,那么定義的VARCHAR最大有32,672個字節長;如果要存儲的字節長超過表的頁大小,那么需要為字段定義大數據類型存儲數據。
DB2的大數據類型有CLOB和BLOB兩種,分別存儲字符或者二進制數據。而在MySQL中對大數據字段的定義則更加精細,分別為不同長度的大數據字段設計了不同層次的字段類型。
如上圖所示,DB2中CLOB(n)和BLOB(n)兩種大數據字段類型因其定義的大小不同而分別對應了MySQL數據庫中的八種數據類型。
自增字段類型
DB2允許在Create table時能且只能為表中的一個字段指定為Identity自增字段,分別有Generatedalways和Generated bydefault兩種形式,表示定義的自增字段不允許人工(應用)干預或者允許人工干預。
MySQL數據庫中的自增字段只需要AUTO_INCREMENT修飾即可,而且該字段是人工可干預的。
總結
前述主要對比了DB2數據庫和MySQL數據庫在基本數據類型上的一些差異,對這些差異的掌握了解在做DB2數據庫遷移到MySQL數據庫工作中必不可少。為了方便比對,將兩種數據庫的數據類型總結如下圖所示: