MySQL和Oracle區別
- 使用的群眾:MySql中小型資料庫,開源的免費使用,輕便簡單,當然也是初學者的最佳選擇,市場使用率排在Oracle之後;Oracle大型資料庫,需要高昂的價格,效能較好支援大併發大訪問量,是聯機事務處理(OLTP)的最好工具,所以市場的使用率也是相當高的。
- 安裝使用時,對電腦的效能要求也是不一樣的。MySql安裝完後僅佔100M多點的記憶體,不怎麼耗費電腦資源。但是Oracle由於功能強大,安裝完後會佔用電腦3G的記憶體,並且執行時候所佔電腦資源也是相當大的。
- 二者在使用時的區別:
- 主鍵:
MySql一般使用自動增長型別,在建立表的時候只要指定表的主鍵為auto increment,插入記錄時就不需要再為主鍵新增記錄了,主鍵會自動增長。Oracle中沒有自動增長,主鍵一般使用自動增長序列
- 單引號的處理:
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或空字元,需要把它改成一個空格的字串。 |