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