oracle&mysql對(duì)比
數(shù)據(jù)類型對(duì)比
1.字符型
mysql的字符型根據(jù)長(zhǎng)度和是否定長(zhǎng)分為了很多類型,常見(jiàn)的有char,varchar,以及各種不定長(zhǎng)的text和blob(tiny,medium,long)炒瘸。
oracle常用的字符型就是nvarchar2和varchar2,其實(shí)還有數(shù)據(jù)類型是varchar和nvarchar,但是實(shí)在舊版本的oracle里面使用,而且無(wú)法解析中文,因此我們常用的是nvarchar2和varchar,對(duì)于比較大的字符串干旧,會(huì)在后面提到長(zhǎng)字符串的處理雨女。
2.數(shù)字型
mysql內(nèi)根據(jù)根據(jù)整數(shù)和浮點(diǎn)數(shù)分為了int和double,根據(jù)數(shù)據(jù)范圍類似字符型也分為了tiny,medium,long之類的松忍。
oracle里主要使用number(p,s)和float(126位二進(jìn)制)致开。
3.日期類型
mysql內(nèi)的數(shù)據(jù)類型包括date,datetime,timestamp三種類型弦撩,且插入方式可以是字符串或者時(shí)間文虏。
oracle內(nèi)的時(shí)間類型分為date和timestamp,插入時(shí)必須把時(shí)間格式的字符串轉(zhuǎn)換成時(shí)間類型文件瞒瘸。
同樣的,從oracle里取出時(shí)間的時(shí)候,如果不進(jìn)行處理,會(huì)根據(jù)不同的IDE將它解析成不同的格式,因此取出時(shí)間的時(shí)候需要將它轉(zhuǎn)換成字符串(to_char函數(shù))坷备。
4.長(zhǎng)字符串處理
長(zhǎng)字符串常用的字段類型是clob和blob,區(qū)別在于clob直接存儲(chǔ)文字情臭,blob是按照二進(jìn)制存儲(chǔ)省撑。
無(wú)論是clob還是blob的存儲(chǔ)范圍都是0-4G。
因此在存儲(chǔ)的時(shí)候俯在,純文本信息(如文章或者較長(zhǎng)的文字)直接使用clob存儲(chǔ)竟秫。而音樂(lè)、圖片跷乐、文件等信息先轉(zhuǎn)換成二進(jìn)制肥败,再存儲(chǔ)進(jìn)blob。
自增主鍵問(wèn)題
oracle沒(méi)有自增主鍵的設(shè)置愕提,如果需要設(shè)置自增主鍵馒稍,需要自己來(lái)通過(guò)自加序列和觸發(fā)器來(lái)配合設(shè)置自增主鍵。(http://blog.csdn.net/chaishen10000/article/details/12219103 )
CREATE SEQUENCE emp_sequence INCREMENT BY 1 -- 每次加幾個(gè)
START WITH 1 -- 從1開(kāi)始計(jì)數(shù)
NOMAXVALUE -- 不設(shè)置最大值
NOCYCLE -- 一直累加浅侨,不循環(huán)
NOCACHE -- 不建緩沖區(qū)
以上代碼完成了一個(gè)序列(sequence)的建立過(guò)程纽谒,名稱為emp_sequence,范圍是從1開(kāi)始到無(wú)限大(無(wú)限大的程度是由你機(jī)器決定的)仗颈,nocycle是決定不循環(huán)佛舱,如果你設(shè)置了最大值那么你可以用cycle,使seq到最大之后循環(huán)椎例。
對(duì)于nocache,如果你給出了cache值那么系統(tǒng)將自動(dòng)讀取你的cache值大小個(gè)seq,這樣在反復(fù)操作時(shí)會(huì)加快運(yùn)行速度,但如果遭遇意外情況如當(dāng)機(jī)了或oracle死了请祖,則下次取出的seq值將和上次的不連貫(如果連不連貫無(wú)所謂建議用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;
也可以不通過(guò)觸發(fā)器刷晋,直接在sql語(yǔ)句內(nèi)部實(shí)現(xiàn)。(不建議)
INSERT INTO example(id,Name,phone,address)
Values(emp_sequence.nextval,'wxb','54483','wh')慎陵;
分頁(yè)問(wèn)題
1.mysql中的分頁(yè)
較為簡(jiǎn)單的做法(隨著數(shù)據(jù)量的增大眼虱,效率會(huì)變低)
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中的分頁(yè)
在oracle中分頁(yè)處理比較麻煩
每個(gè)結(jié)果集只有一個(gè)ROWNUM字段標(biāo)明它的位置, 并且只能用類似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里面使用捏悬,其他的字段必須處理過(guò),或者經(jīng)過(guò)group by子句經(jīng)過(guò)分類润梯。
例如:
select name,max(age) from user;
這行sql在mysql里面是可以正常執(zhí)行的过牙,但是在oracle里面不能執(zhí)行。
select name,max(age) from user group by name;
而經(jīng)過(guò)加入group by 將列name進(jìn)行分組之后就可以正常執(zhí)行了纺铭。
空字符的處理
mysql非空字段的內(nèi)容可以有空的內(nèi)容寇钉,而oracle里面非空字段不容許有空的內(nèi)容,因此導(dǎo)入數(shù)據(jù)的時(shí)候需要對(duì)空字符判斷舶赔。
Mybatis JdbcType與Oracle扫倡、MySql數(shù)據(jù)類型對(duì)應(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中的對(duì)比
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>