oracle&mysql對比

oracle&mysql對比


數(shù)據(jù)類型對比

1.字符型

mysql的字符型根據(jù)長度和是否定長分為了很多類型,常見的有char,varchar,以及各種不定長的text和blob(tiny,medium,long)。

oracle常用的字符型就是nvarchar2和varchar2,其實還有數(shù)據(jù)類型是varchar和nvarchar,但是實在舊版本的oracle里面使用,而且無法解析中文,因此我們常用的是nvarchar2和varchar,對于比較大的字符串,會在后面提到長字符串的處理。

2.數(shù)字型

mysql內(nèi)根據(jù)根據(jù)整數(shù)和浮點數(shù)分為了int和double,根據(jù)數(shù)據(jù)范圍類似字符型也分為了tiny,medium,long之類的。

oracle里主要使用number(p,s)和float(126位二進制)。

3.日期類型

mysql內(nèi)的數(shù)據(jù)類型包括date,datetime,timestamp三種類型,且插入方式可以是字符串或者時間。

oracle內(nèi)的時間類型分為date和timestamp,插入時必須把時間格式的字符串轉(zhuǎn)換成時間類型文件。

同樣的,從oracle里取出時間的時候,如果不進行處理,會根據(jù)不同的IDE將它解析成不同的格式,因此取出時間的時候需要將它轉(zhuǎn)換成字符串(to_char函數(shù))。

4.長字符串處理

長字符串常用的字段類型是clob和blob,區(qū)別在于clob直接存儲文字,blob是按照二進制存儲。

無論是clob還是blob的存儲范圍都是0-4G。

因此在存儲的時候,純文本信息(如文章或者較長的文字)直接使用clob存儲。而音樂、圖片、文件等信息先轉(zhuǎn)換成二進制,再存儲進blob。


自增主鍵問題

oracle沒有自增主鍵的設(shè)置,如果需要設(shè)置自增主鍵,需要自己來通過自加序列和觸發(fā)器來配合設(shè)置自增主鍵。(http://blog.csdn.net/chaishen10000/article/details/12219103

CREATE SEQUENCE emp_sequence INCREMENT BY 1 -- 每次加幾個 

START WITH 1 -- 從1開始計數(shù)

NOMAXVALUE -- 不設(shè)置最大值

NOCYCLE -- 一直累加,不循環(huán)

NOCACHE -- 不建緩沖區(qū) 

以上代碼完成了一個序列(sequence)的建立過程,名稱為emp_sequence,范圍是從1開始到無限大(無限大的程度是由你機器決定的),nocycle是決定不循環(huán),如果你設(shè)置了最大值那么你可以用cycle,使seq到最大之后循環(huán)。

對于nocache,如果你給出了cache值那么系統(tǒng)將自動讀取你的cache值大小個seq,這樣在反復(fù)操作時會加快運行速度,但如果遭遇意外情況如當機了或oracle死了,則下次取出的seq值將和上次的不連貫(如果連不連貫無所謂建議用cache)。

其次建立觸發(fā)器,在向表內(nèi)部插入數(shù)據(jù)前觸發(fā)。(以表'example'為例)

CREATE TRIGGER trigger_name 
BEFORE 
    INSERT ON example FOR EACH ROW WHEN (new.id is null) 
begin 
    select emp_sequence.nextval into :new.id from dual; 
end; 

也可以不通過觸發(fā)器,直接在sql語句內(nèi)部實現(xiàn)。(不建議)

INSERT INTO example(id,Name,phone,address) 
Values(emp_sequence.nextval,'wxb','54483','wh');

分頁問題

1.mysql中的分頁

較為簡單的做法(隨著數(shù)據(jù)量的增大,效率會變低)

select * from tablename order by id desc 
limit (page-1)*pageSize, pageSize;  

較為高效的做法

select * from tablename 
where id>=
(
    select id from tablename order by id limit (page-1)*pageSize, 1
) 
limit pageSize;  
2.oracle中的分頁

在oracle中分頁處理比較麻煩

每個結(jié)果集只有一個ROWNUM字段標明它的位置, 并且只能用類似ROWNUM<100, 而不能用ROWNUM>80。

select * from 
(
    select t.*,rownum as rn from 
    (select * from tablename) as t where rownum<=page*pageSize
) 
where rn>(page-1)*pageSize; 

組函數(shù)用法規(guī)則

組函數(shù)(如count,max,min)之類的函數(shù)在mysql里面可以隨意使用,但是如果在oracle里面使用,其他的字段必須處理過,或者經(jīng)過group by子句經(jīng)過分類。

例如:

select name,max(age) from user;

這行sql在mysql里面是可以正常執(zhí)行的,但是在oracle里面不能執(zhí)行。

select name,max(age) from user group by name;

而經(jīng)過加入group by 將列name進行分組之后就可以正常執(zhí)行了。


空字符的處理

mysql非空字段的內(nèi)容可以有空的內(nèi)容,而oracle里面非空字段不容許有空的內(nèi)容,因此導(dǎo)入數(shù)據(jù)的時候需要對空字符判斷。


Mybatis JdbcType與Oracle、MySql數(shù)據(jù)類型對應(yīng)列表

Mybatis JdbcType Oracle MySql
JdbcType ARRAY
JdbcType BIGINT BIGINT
JdbcType BINARY
JdbcType BIT BIT
JdbcType BLOB BLOB BLOB
JdbcType BOOLEAN
JdbcType CHAR CHAR CHAR
JdbcType CLOB CLOB CLOB
JdbcType CURSOR
JdbcType DATE DATE DATE
JdbcType DECIMAL DECIMAL DECIMAL
JdbcType DOUBLE NUMBER DOUBLE
JdbcType FLOAT FLOAT FLOAT
JdbcType INTEGER INTEGER INTEGER
JdbcType LONGVARBINARY
JdbcType LONGVARCHAR LONG VARCHAR
JdbcType NCHAR NCHAR
JdbcType NCLOB NCLOB
JdbcType NULL
JdbcType NUMERIC NUMERIC/NUMBER NUMERIC/
JdbcType NVARCHAR
JdbcType OTHER
JdbcType REAL REAL REAL
JdbcType SMALLINT SMALLINT SMALLINT
JdbcType STRUCT
JdbcType TIME TIME
JdbcType TIMESTAMP TIMESTAMP TIMESTAMP
JdbcType TINYINT TINYINT
JdbcType UNDEFINED
JdbcType VARBINARY
JdbcType VARCHAR VARCHAR VARCHAR

mapper中的對比

1. 模糊查詢
oracle:

<select id="searchUserBySearchName" parameterType="java.lang.String"      resultType="com.urm.entity.User">  
  select * from t_user where user_name like CONCAT('%',#{search_name},'%')  
</select>  

<select id="searchUserBySearchName" parameterType="java.lang.String" resultType="com.urm.entity.User">  
  select * from t_user where user_name like '%'||#{search_name}||'%'   
</select>  

mysql:
<select id="searchUserBySearchName" parameterType="java.lang.String" resultType="com.urm.entity.User">  
  select * from t_user where user_name like CONCAT('%',#{search_name},'%')  
</select>  
2. 批量更新
oracle:
<updateidupdateid="batchUpdate" parameterType="java.util.List">  

     <foreach collection="list" item="item" index="index" open="begin" close="end;" separator=";">  
              updatetest  
              <set>  
                test=${item.test}+1  
              </set>  
              whereid = ${item.id}  
     </foreach>  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,832評論 0 11
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,740評論 18 399
  • 什么是數(shù)據(jù)庫? 數(shù)據(jù)庫是存儲數(shù)據(jù)的集合的單獨的應(yīng)用程序。每個數(shù)據(jù)庫具有一個或多個不同的API,用于創(chuàng)建,訪問,管理...
    chen_000閱讀 4,053評論 0 19
  • 以前的看電影,據(jù)分析還是小青年擠眉弄眼,談情說愛,曖昧表白的時候,那時候,大城市及港臺文化沖擊也不小,也教壞了一批...
    瑀軒閱讀 349評論 0 0
  • 我有一杯水足以慰風(fēng)塵。 曾、放在心尖尖上的那人如今在身側(cè)么? 若、回頭重走當時路會做出哪樣的選擇? 我曾渴望永恒、...
    三水目閱讀 255評論 0 0