最近做了幾個項目,我對項目的要求(有些也是客戶的要求)都是既要能用mysql數據庫,又要能用oracle數據庫,開發時盡量用mysql,等到發布時要求兩者都能適應。因為兩種數據庫還是許多具體的應用有些不同,而我們開發中采用的技術又有各種,所以基本上都是采用手動去轉換,具體轉換過程如下:
一、分表結構及表數據兩次導出。一次導出去轉換之后導入oracle中比較麻煩,所以我們一般在mysql導出時將導出分成個結構及個數據兩次導出。導出之后將個結構語句修改,具體修改如下:
二、對表的修改:
0、去掉`,`這個是mysql的特殊標示符,轉換前要去掉
1、將所有的text替換成varchar2(4000)。有些轉換工具將text是轉換成blob或clob,我覺得那樣不好,一般還是轉換成varchar2(2000)或varchar2(4000)比較好。雖然采用spring或oracle10g可以clob當作string去處理,但是我覺得一般情況下還是轉換成varchar2比較好,如果字段內容確實需要更長(varchar2最長是4000),在這種情況下采用clob就比較好了。
2、將所有的varchar替換成 varchar2 。
3、將tinyint(1)替換成number(1)。
4、將int(4)替換成number(4)。
5、去掉auto_increment選擇項。oracle中沒有自增屬性,所以要去掉。
6、將NOT NULL default ''替換成default '' NOT
NULL。關鍵是這兩個的順序不能錯,也不知道為什么,實際中總結出來的。
7、將ON DELETE CASCADE ON UPDATE CASCADE替換成ON DELETE CASCADE ON
UPDATE CASCADE。
8、將外鍵前的KEY cq_formid (cq_formid)去掉。
9、將CONSTRAINT 0_99 FOREIGN改成CONSTRAINT fk_99 FOREIGN。
10、將mediumblob轉換成blob。
11、將所有非主鍵的not null去掉。
12、將外鍵全部移到最后(在數據導完之后再執行)。
三、對數據修改:
0、去掉`,`這個是mysql的特殊標示符,轉換前要去掉,在做個結構轉換時也要去掉。
1、\'替換成''。\為mysql的轉義字符,而oracle的轉義字符為單引號。
2、?替換成?。這種是在執行sql插入語句一些特殊字符被oracle當做參數,這種我還沒有找到好的處理方法,一般就還是輸入相應的字符吧。有誰知道更好的處理方法可以告訴我一下。
3、,'',替換成,''''。這也是需要轉義引起的。
在程序處理中mysql與oracle數據庫還有些具體的不同,具體的不同情況如下:
mysql與oracle的不同:
1、mysql自動增量。oracle中沒有自動增量,一般采用序列去實現類似功能,但是需根在程序中特殊處理(采用hibernate時不需要特殊處理)。
2、limit。在mysql中一般采用limit去實現分頁功能,而oracle中一般采用rownum去實現分頁。
3、date。兩種數據庫對date的處理也不一樣,mysql中更加靈活吧。
4、LEFT函數。oracle中沒有相同的函數,我一般自定義一個left函數去實現mysql相同的功能,那樣就不用去修改程序了。
oracle中增加:
create or replace function LEFT(String1 in varchar2, pos in
integer)
return varchar2 is
begin
return(substr(String1, 0, pos));
end LEFT;
/
5、空與空串。mysql中空與空串是兩個不同的東西,而在oracle中將null與空串做了同樣的處理,這也是在程序中需要注意的于方。
6、rs.isLast()。當數據庫為mysql在Connection.prepareStatement(str1);可用,而在oracle中必須Connection.prepareStatement(str1,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)才能使用rs.isLast(),一般兩種情況都采用后面的就可以了吧。
7、在oracle中update fieldsdisplaymode f set
f.fdm_displaycontent=Translate(f.fdm_displaycontent,'\'',''''
);這是將insert語句中的\'全部替換成'',還是一種語義的轉換。
8、sysdate。在mysql中采用sysate()而在oracle中采用的是sysdate,兩個稍有不同,也可以在oracle中定義函數去處理。