1. 程式人生 > >MySQL和Oracle區別

MySQL和Oracle區別

  1. 使用的群眾:MySql中小型資料庫,開源的免費使用,輕便簡單,當然也是初學者的最佳選擇,市場使用率排在Oracle之後;Oracle大型資料庫,需要高昂的價格,效能較好支援大併發大訪問量,是聯機事務處理(OLTP)的最好工具,所以市場的使用率也是相當高的。
  2. 安裝使用時,對電腦的效能要求也是不一樣的。MySql安裝完後僅佔100M多點的記憶體,不怎麼耗費電腦資源。但是Oracle由於功能強大,安裝完後會佔用電腦3G的記憶體,並且執行時候所佔電腦資源也是相當大的。
  3. 二者在使用時的區別:
  • 主鍵:

  MySql一般使用自動增長型別,在建立表的時候只要指定表的主鍵為auto increment,插入記錄時就不需要再為主鍵新增記錄了,主鍵會自動增長。Oracle中沒有自動增長,主鍵一般使用自動增長序列

,插入記錄時將序列號的下一值付給該欄位即可,只是ORM框架只是需要native主鍵生成策略即可。

  • 單引號的處理:

  MySql裡可以使用雙引號來包起字串,Oracle裡要使用單引號包起字串。

  • 分頁查詢:

  這個應該是兩者最明顯的區別了,很多人都知道MySql中分頁很簡單,因為他有專門的關鍵字limit來實現分頁查詢;但是Oracle裡面沒有這種關鍵字來實現分頁查詢的,所以它實現起來就比MySql要繁瑣得多了,在每個結果集中只有一個rownum欄位標明它的位置,並且只能用rownum<=某個數,不能用rownum>=某個數,因為ROWNUM是偽列,在使用時所以需要為ROWNUM取一個別名,變成邏輯列,然後來操作。

 select * from (select ROWNUM as num,A.* from (select * from test) A where ROWNUM <=40) where num >= 20;

  這是這兩者的最大的不同.
  • 日期欄位的處理

           MYSQL日期欄位分DATE和TIME兩種,ORACLE日期欄位只有DATE,包含年月日時分秒資訊,用當前資料庫的系統時間為SYSDATE, 精確到秒,或者用字串轉換成日期型函式TO_DATE(‘<st1:chsdate isrocdate="False" islunardate="False" day="1" month="8" year="2001">2001-08-01</st1:chsdate>’,’YYYY-MM-DD’)年-月-日 24小時:分鐘:秒 的格式YYYY-MM-DD HH24:MI:SS TO_DATE()還有很多種日期格式, 可以參看ORACLE DOC.日期型欄位轉換成字串函式TO_CHAR(‘<st1:chsdate isrocdate="False" islunardate="False" day="1" month="8" year="2001">2001-08-01</st1:chsdate>’,’YYYY-MM-DD HH24:MI:SS’)

    日期欄位的數學運算公式有很大的不同。MYSQL找到離當前時間7天用 DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到離當前時間7天用 DATE_FIELD_NAME >SYSDATE - 7;

  • 空字元的處理

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

  • 字串的模糊比較

          MYSQL裡用 欄位名 like '%字串%',ORACLE裡也可以用 欄位名 like '%字串%' 但這種方法不能使用索引, 速度不快,用字串比較函式 instr(欄位名,'字串')>0 會得到更精確的查詢結果。

  • 長字串的處理:

  Oracle有它獨特的地方,資料型別有一個clob型別,此型別專門用於在insert或者update時候字串長度大於等於4000個單位元組時使用。所以在插入記錄前一定要進行非空和長度的判斷,不能為空的或者長度超出的都應該提出警告,返回上次操作。MySql就沒有這樣的資料型別。

       oracle: 
              建立表: 
              create table cw (id varchar2(20) primary key not null); 
              create table cw (id varchar2(20) primary key not null,name varchar2(20)); 
              更新表(增加欄位): 
              alter table cw add name varchar2(20); 
              alter table cw add (age varchar2(20),sex varchar(20),z varchar2(20),zz varchar2(20)); 
              更新表(修改欄位): 
              alter table cw modify age number; 
              alter table cw modify(id number ,name number); 
              更新表(刪除欄位): 
              alter table cw drop z; 
              alter table cw drop (z,zz); 
              刪除表: 
              drop table cw;

        mysql: 
              建立表: 
              create table cw (id varchar(20) primary key not null); 
              create table cw (id varchar(20) primary key not null,name varchar(20)); 
              更新表(增加欄位): 
              alter table cw add name varchar(20); 
              alter table cw add (age varchar(20),sex varchar(20),z varchar(20),zz varchar(20)); 
              更新表(修改欄位): 
              alter table cw modify age varchar(20); 
              alter table cw modify age int ,modify name varchar(20); 
              更新表(刪除欄位): 
              alter table cw drop column z; 
              alter table cw drop column z,drop column zz; 
              刪除表: 
              drop table cw;

區別: 
1.資料型別上兩者的區別: 
兩者在資料型別上的區別還是較大的,引用一下: 
https://www.cnblogs.com/HondaHsu/p/3641116.html 
特別說明:oracle在用varchar(20)時,建立時會自動變成varchar2(20),varchar和varchar2沒太大區別,建議使用varchar2 
2.更新表時,在修改和刪除多個欄位時,兩者還是有較大區別的 
聯絡: 
1.在建立和刪除表,以及更新表增加欄位時,兩者沒有什麼區別

編號 ORACLE MYSQL 註釋
1 NUMBER int / DECIMAL DECIMAL就是NUMBER(10,2)這樣的結構INT就是是NUMBER(10),表示整型;
MYSQL有很多類int型,tinyint mediumint bigint等,不同的int寬度不一樣
2 Varchar2(n) varchar(n)
3 Date DATATIME 日期欄位的處理
MYSQL日期欄位分DATE和TIME兩種,ORACLE日期欄位只有DATE,包含年月日時分秒資訊,用當前資料庫的系統時間為 SYSDATE, 精確到秒,或者用字串轉換成日期型函式TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)年-月-日 24小時:分鐘:秒的格式YYYY-MM-DD HH24:MI:SS TO_DATE()還有很多種日期格式, 可以參看ORACLE DOC.日期型欄位轉換成字串函式TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’)

日期欄位的數學運算公式有很大的不同。MYSQL找到離當前時間7天用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到離當前時間7天用 DATE_FIELD_NAME >SYSDATE - 7;

MYSQL中插入當前時間的幾個函式是:NOW()函式以`'YYYY-MM-DD HH:MM:SS'返回當前的日期時間,可以直接存到DATETIME欄位中。CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE欄位中。CURTIME()以’HH:MM:SS’的格式返回當前的時間,可以直接存到TIME欄位中。例:insert into tablename (fieldname) values (now())

而oracle中當前時間是sysdate
4 INTEGER int / INTEGER Mysql中INTEGER等價於int
5 EXCEPTION SQLEXCEPTION  詳見<<2009001-eService-O2MG.doc>>中2.5 Mysql異常處理
6 CONSTANT VARCHAR2(1) mysql中沒有CONSTANT關鍵字 從ORACLE遷移到MYSQL,所有CONSTANT常量只能定義成變數
7 TYPE g_grp_cur IS REF CURSOR; 游標 : mysql中有替代方案 詳見<<2009001-eService-O2MG.doc>>中2.2 游標處理
8 TYPE unpacklist_type IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER; 陣列: mysql中藉助臨時表處理
或者直接寫邏輯到相應的程式碼中,
直接對集合中每個值進行相應的處理
詳見<<2009001-eService-O2MG.doc>>中2.4 陣列處理
9 自動增長的序列 自動增長的資料型別 MYSQL有自動增長的資料型別,插入記錄時不用操作此欄位,會自動獲得資料值。ORACLE沒有自動增長的資料型別,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦於此欄位。
10 NULL NULL 空字元的處理
MYSQL的非空欄位也有空的內容,ORACLE裡定義了非空欄位就不容許有空的內容。按MYSQL的NOT NULL來定義ORACLE表結構, 導資料的時候會產生錯誤。因此導資料時要對空字元進行判斷,如果為NULL或空字元,需要把它改成一個空格的字串。