將資料從MySQL遷移到Oracle的注意事項

來源:互聯網
上載者:User

標籤:fse   位置   鍵盤   指令碼   語言   clob   資料庫名   定義   需要   

將資料從MySQL遷移到Oracle的注意事項


1.自動成長的資料類型處理
MYSQL有自動成長的資料類型,插入記錄時不用操作此欄位,會自動獲得資料值。ORACLE沒有自動成長的
資料類型,需要建立一個自動成長的序號,插入記錄時要把序號的下一個值賦於此欄位。
CREATE SEQUENCE 序號的名稱 (最好是表名+序號標記)
INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
INSERT 語句插入這個欄位值為: 序號的名稱.NEXTVAL


2. 單引號的處理
MYSQL裡可以用雙引號包起字串,ORACLE裡只可以用單引號包起字串。在插入和修改字串前必須做
單引號的替換:把所有出現的一個單引號替換成兩個單引號。當然你如果使用 Convert Mysql to Oracle
工具就不用考慮這個問題


3.長字串的處理
在ORACLE中,INSERT和UPDATE時最大可操作的字串長度小於等於4000個單位元組, 如果要插入更長的字元
串, 請考慮欄位用CLOB類型,方法借用ORACLE裡內建的DBMS_LOB程式包。插入修改記錄前一定要做進行非
空和長度判斷,不可為空的欄位值和超出長度欄位值都應該提出警告,返回上次操作。


4. 翻頁的SQL語句的處理
MYSQL處理翻頁的SQL語句比較簡單,用LIMIT 開始位置, 記錄個數。ORACLE處理翻頁的SQL語句就比較繁瑣
了。每個結果集只有一個ROWNUM欄位標明它的位置, 並且只能用ROWNUM<100, 不能用ROWNUM>80。


以下是經過分析後較好的兩種ORACLE翻頁SQL語句(ID是唯一關鍵字的欄位名):
語句一:
SELECT ID, FIELD_NAME,.. .
FROM TABLE_NAME
WHERE ID IN (SELECT ID
FROM (SELECT ROWNUM AS NUMROW, ID
FROM TABLE_NAME
WHERE 條件1
ORDER BY 條件2)
WHERE NUMROW > 80
AND NUMROW < 100)
ORDER BY 條件3;
語句二:
SELECT *
FROM ((SELECT ROWNUM AS NUMROW, c.*
from (select FIELD_NAME,.. .
FROM TABLE_NAME
WHERE 條件1
ORDER BY 條件2) c) WHERE NUMROW > 80 AND NUMROW < 100)
ORDER BY 條件3;


5. 日期欄位的處理
MYSQL日期欄位分DATE和TIME兩種,ORACLE日期欄位只有DATE,包含年月日時分秒資訊,用當前資料庫的
系統時間為SYSDATE, 精確到秒。
日期欄位的數學運算公式有很大的不同。
MYSQL找到離目前時間7天用:DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)
ORACLE找到離目前時間7天用:DATE_FIELD_NAME >SYSDATE - 7;


6. 字串的模糊比較
MYSQL裡用 欄位名 like ‘%字串%‘,ORACLE裡也可以用 欄位名 like ‘%字串%‘ 但這種方法不能使用
索引, 速度不快,用字串比較函數 instr(欄位名,‘字串‘)>0 會得到更精確的尋找結果。


7. Null 字元的處理
MYSQL的非空欄位也有空的內容,ORACLE裡定義了非空欄位就不容許有空的內容。按MYSQL的NOT NULL來定
義ORACLE表結構, 導資料的時候會產生錯誤。因此導資料時要對Null 字元進行判斷,如果為NULL或Null 字元,
需要把它改成一個空格的字串。

Oracle移植到mysql注意事項
客戶用的資料庫是mysql,而研發好的產品支援oracle,我們必須把資料庫環境從oracle移植到mysql。在
移植的過程中碰到了下面一些問題,如果我們在最初的設計、編碼過程中注意資料庫的移植性,這種情況
下可以完全不需要作額外工作。


一、資料庫環境從oracle移植到mysql碰到的問題。
1、 大小寫敏感的區別(如果伺服器OS是linux)。
在oracle中一般情況下不區分大小寫。有時候我們在使用oracle不注意大小寫問題,表名和欄位名不加
雙引號是不區分大小寫,像這樣:insert into tableName 和 insert into TABLENAME效果是一樣的,
用工具匯出建立/資料初始化指令碼,得到的結果一般表名和欄位名轉化成了大寫。


但在MySQL中,所使用作業系統的大小寫敏感性決定了資料庫名和表名的大小寫敏感性。資料庫對應資料
目錄中的目錄,資料庫中的每個表至少對應資料庫目錄中的一個檔案(也可能是多個,取決於儲存引擎)。
因此,使用資料庫或表實際上是操縱這些檔案(夾),所以使用作業系統的大小寫敏感性決定了資料庫名和
表名的大小寫敏感性。在以linux為核心的作業系統中是大小寫敏感的。


解決的辦法,是把mysql的資料庫名和oracle的大小寫保持一致,表名與應用程式中sql字串中的表名保持
一致,如果應用程式中欄位名用了雙引號,那請把sql中的欄位名大小寫與雙引號裡的字元保持一致。如果
你的應用程式所引用的表名、欄位沒有統一大小寫,那麻煩就大了。


2、保留字的區別。
像sql語言的函數名(如:inteval,show)等是保留字。Oracle中保留字是可以作為表名和欄位名,並且不
影響使用,但mysql中保留字是不能作為表名和欄位名,如果使用會報語法錯誤。


解決辦法,把sql語句中的保留字用‘`’符號引起來,這個符號位於鍵盤的tab鍵上面;如果是欄位名還有另
外一種方法tablename.欄位名。像這樣:
insert into tablename (id, `interval`) value(…..

insert into tablename (id, tablename.inteval) value(…..


3、自動成長類型的區別。
Oracle有sequence,mysql中沒有,但有auto_increment屬性。


解決辦法是把Oracle中sequence轉換成使用auto_increment屬性,某些情況可能還有一種辦法可以解決
問題,建立一個獨立的表用來專門記錄自動成長型的資料。


4、資料類型的區別。
在mysql中沒有像oracle中的varchar2、number,mysql有與之對應的varchar、numeric,當然在oracle中沒有mysql的time類型。


解決辦法是替換。


5、索引長度限制的區別。
從MySQL 4.1.2開始,MyISAM和InnoDB表索引長度支援1000位元組,也就是說索引欄位的長度不能超過1000
位元組,如果超過會報這樣的錯:
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes。
如果是UTF-8編碼,相當於333個字元的長度(因為UTF8一個字元佔3個位元組)。Oracle的索引長度限制比mysql要寬鬆得多。


解決的辦法就不必要多說了,要麼改索引的定義,要麼改欄位的定義長度。


二、為了資料庫的相容性我們應該注意些什麼。
資料庫的相容性應該是資料庫設計應該重視的一個問題,因為有時候客戶存在已經在用的資料庫,並且
不希望同時維護兩個資料庫,這樣的話相容多種資料庫還能成為產品的一個賣點。


作到資料庫的相容性關鍵是遵守標準用法。


1、 遵守標準用法,盡量不使用某種資料庫特有的用法。
如msyql的‘`’符號的用法,
再比如,很多人有這種用法,
在使用oracle開發的時候建立sequence,往表中插資料之前先SELECT seq.nextval FROM DUAL;,
然後把查詢得到的值作為value插入表中,這種用法沒法適應沒有sequence的資料庫,每個資料庫都有自
動增長型的用法,如果需要使用就應該完全地使用。
再舉個例子,不同的資料庫對分頁查詢作了擴充,postgresql有offset,limit,oracle就沒有。


2、 保留字。
要求資料庫設計者盡量不使用保留字作表名和欄位名。也有很多人有這種用法,在表名和欄位名前加‘_’,
像這樣:create table _tablename ( _id integer)。這樣永遠不會出現保留字引起的問題。


3、 避免資料庫大小寫敏感的問題。
選擇資料庫表名和欄位名採用大寫還是小寫,並且在資料庫的設計和編碼過程中完全統一。
當使用 Convert Oracle to Mysql 工具時,請注意“名稱轉換為大寫”這個選項的控制

將資料從MySQL遷移到Oracle的注意事項

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.