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>