數據從MySQL遷移到Oracle 需求留意什麼。本站提示廣大學習愛好者:(數據從MySQL遷移到Oracle 需求留意什麼)文章只能為提供參考,不一定能成為您想要的結果。以下是數據從MySQL遷移到Oracle 需求留意什麼正文
將數據從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. 空字符的處置
MYSQL的非空字段也有空的內容,ORACLE裡定義了非空字段就不允許有空的內容。按MYSQL的NOT NULL來定義ORACLE表構造, 導數據的時分會發生錯誤。因而導數據時要對空字符停止判別,假如為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 工具時,請留意“稱號轉換為大寫”這個選項的控制。
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支持。