mysql换成oracle_从mysql转换到oracle数据库
最近做了幾個(gè)項(xiàng)目,我對(duì)項(xiàng)目的要求(有些也是客戶的要求)都是既要能用mysql數(shù)據(jù)庫(kù),又要能用oracle數(shù)據(jù)庫(kù),開發(fā)時(shí)盡量用mysql,等到發(fā)布時(shí)要求兩者都能適應(yīng)。因?yàn)閮煞N數(shù)據(jù)庫(kù)還是許多具體的應(yīng)用有些不同,而我們開發(fā)中采用的技術(shù)又有各種,所以基本上都是采用手動(dòng)去轉(zhuǎn)換,具體轉(zhuǎn)換過(guò)程如下:
一、分表結(jié)構(gòu)及表數(shù)據(jù)兩次導(dǎo)出。一次導(dǎo)出去轉(zhuǎn)換之后導(dǎo)入oracle中比較麻煩,所以我們一般在mysql導(dǎo)出時(shí)將導(dǎo)出分成個(gè)結(jié)構(gòu)及個(gè)數(shù)據(jù)兩次導(dǎo)出。導(dǎo)出之后將個(gè)結(jié)構(gòu)語(yǔ)句修改,具體修改如下:
二、對(duì)表的修改:
0、去掉`,`這個(gè)是mysql的特殊標(biāo)示符,轉(zhuǎn)換前要去掉
1、將所有的text替換成varchar2(4000)。有些轉(zhuǎn)換工具將text是轉(zhuǎn)換成blob或clob,我覺得那樣不好,一般還是轉(zhuǎn)換成varchar2(2000)或varchar2(4000)比較好。雖然采用spring或oracle10g可以clob當(dāng)作string去處理,但是我覺得一般情況下還是轉(zhuǎn)換成varchar2比較好,如果字段內(nèi)容確實(shí)需要更長(zhǎng)(varchar2最長(zhǎng)是4000),在這種情況下采用clob就比較好了。
2、將所有的varchar替換成 varchar2 。
3、將tinyint(1)替換成number(1)。
4、將int(4)替換成number(4)。
5、去掉auto_increment選擇項(xiàng)。oracle中沒有自增屬性,所以要去掉。
6、將NOT NULL default ''替換成default '' NOT
NULL。關(guān)鍵是這兩個(gè)的順序不能錯(cuò),也不知道為什么,實(shí)際中總結(jié)出來(lái)的。
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轉(zhuǎn)換成blob。
11、將所有非主鍵的not null去掉。
12、將外鍵全部移到最后(在數(shù)據(jù)導(dǎo)完之后再執(zhí)行)。
三、對(duì)數(shù)據(jù)修改:
0、去掉`,`這個(gè)是mysql的特殊標(biāo)示符,轉(zhuǎn)換前要去掉,在做個(gè)結(jié)構(gòu)轉(zhuǎn)換時(shí)也要去掉。
1、\'替換成''。\為mysql的轉(zhuǎn)義字符,而oracle的轉(zhuǎn)義字符為單引號(hào)。
2、?替換成?。這種是在執(zhí)行sql插入語(yǔ)句一些特殊字符被oracle當(dāng)做參數(shù),這種我還沒有找到好的處理方法,一般就還是輸入相應(yīng)的字符吧。有誰(shuí)知道更好的處理方法可以告訴我一下。
3、,'',替換成,''''。這也是需要轉(zhuǎn)義引起的。
在程序處理中mysql與oracle數(shù)據(jù)庫(kù)還有些具體的不同,具體的不同情況如下:
mysql與oracle的不同:
1、mysql自動(dòng)增量。oracle中沒有自動(dòng)增量,一般采用序列去實(shí)現(xiàn)類似功能,但是需根在程序中特殊處理(采用hibernate時(shí)不需要特殊處理)。
2、limit。在mysql中一般采用limit去實(shí)現(xiàn)分頁(yè)功能,而oracle中一般采用rownum去實(shí)現(xiàn)分頁(yè)。
3、date。兩種數(shù)據(jù)庫(kù)對(duì)date的處理也不一樣,mysql中更加靈活吧。
4、LEFT函數(shù)。oracle中沒有相同的函數(shù),我一般自定義一個(gè)left函數(shù)去實(shí)現(xiàn)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中空與空串是兩個(gè)不同的東西,而在oracle中將null與空串做了同樣的處理,這也是在程序中需要注意的于方。
6、rs.isLast()。當(dāng)數(shù)據(jù)庫(kù)為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語(yǔ)句中的\'全部替換成'',還是一種語(yǔ)義的轉(zhuǎn)換。
8、sysdate。在mysql中采用sysate()而在oracle中采用的是sysdate,兩個(gè)稍有不同,也可以在oracle中定義函數(shù)去處理。
總結(jié)
以上是生活随笔為你收集整理的mysql换成oracle_从mysql转换到oracle数据库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Qt弹出的窗口始终位于界面最前面的方法
- 下一篇: mysql kill_Mysql使用ki