DB2 Vs MySQL系列 | MySQL與DB2的資料類型對比,db2mysql
隨著MySQL資料庫的應用越來越廣泛,DB2向MySQL資料庫的遷移需求也越來越多。進行資料庫之間遷移的時候,首先遇到的並且也是最基本最重要的就是兩種資料庫資料類型之間的轉換。
相關閱讀:
從商用到開源:15個維度,全面剖析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中有的基礎資料型別 (Elementary Data Type),在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資料庫在基礎資料型別 (Elementary Data Type)上的一些差異,對這些差異的掌握瞭解在做DB2資料庫遷移到MySQL資料庫工作中必不可少。為了方便比對,將兩種資料庫的資料類型總結如所示:
推薦閱讀:
從商用到開源:DB2遷移至MySQL的最佳實務
15個維度,全面剖析DB2與MySQL資料庫的差異
從Oracle到MySQL大家最關注的竟然是...
MySQL vs Postgre SQL的非技術維度區別
MariaDB助力,MySQL流行度超越Oracle
資源下載
關注公眾號:資料和雲(OraNews)回複關鍵字擷取
‘2017DTC’,2017DTC大會PPT
‘DBALIFE’,“DBA的一天”海報
‘DBA04’,DBA手記4經典篇章電子書
‘INTERNALS’,Oracle RAC PPT
‘122ARCH’,Oracle 12.2體繫結構圖
‘2017OOW’,Oracle OpenWorld資料
‘PRELECTION’,大講堂講師課程資料