oracle&mysql对比
数据类型对比
1.字符型
mysql的字符型根据长度和是否定长分为了很多类型,常见的有char,varchar,以及各种不定长的text和blob(tiny,medium,long)。
oracle常用的字符型就是nvarchar2和varchar2,其实还有数据类型是varchar和nvarchar,但是实在旧版本的oracle里面使用,而且无法解析中文,因此我们常用的是nvarchar2和varchar,对于比较大的字符串,会在后面提到长字符串的处理。
2.数字型
mysql内根据根据整数和浮点数分为了int和double,根据数据范围类似字符型也分为了tiny,medium,long之类的。
oracle里主要使用number(p,s)和float(126位二进制)。
3.日期类型
mysql内的数据类型包括date,datetime,timestamp三种类型,且插入方式可以是字符串或者时间。
oracle内的时间类型分为date和timestamp,插入时必须把时间格式的字符串转换成时间类型文件。
同样的,从oracle里取出时间的时候,如果不进行处理,会根据不同的IDE将它解析成不同的格式,因此取出时间的时候需要将它转换成字符串(to_char函数)。
4.长字符串处理
长字符串常用的字段类型是clob和blob,区别在于clob直接存储文字,blob是按照二进制存储。
无论是clob还是blob的存储范围都是0-4G。
因此在存储的时候,纯文本信息(如文章或者较长的文字)直接使用clob存储。而音乐、图片、文件等信息先转换成二进制,再存储进blob。
自增主键问题
oracle没有自增主键的设置,如果需要设置自增主键,需要自己来通过自加序列和触发器来配合设置自增主键。(http://blog.csdn.net/chaishen10000/article/details/12219103 )
CREATE SEQUENCE emp_sequence INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
NOCACHE -- 不建缓冲区
以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle是决定不循环,如果你设置了最大值那么你可以用cycle,使seq到最大之后循环。
对于nocache,如果你给出了cache值那么系统将自动读取你的cache值大小个seq,这样在反复操作时会加快运行速度,但如果遭遇意外情况如当机了或oracle死了,则下次取出的seq值将和上次的不连贯(如果连不连贯无所谓建议用cache)。
其次建立触发器,在向表内部插入数据前触发。(以表'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;
也可以不通过触发器,直接在sql语句内部实现。(不建议)
INSERT INTO example(id,Name,phone,address)
Values(emp_sequence.nextval,'wxb','54483','wh');
分页问题
1.mysql中的分页
较为简单的做法(随着数据量的增大,效率会变低)
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中分页处理比较麻烦
每个结果集只有一个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;
组函数用法规则
组函数(如count,max,min)之类的函数在mysql里面可以随意使用,但是如果在oracle里面使用,其他的字段必须处理过,或者经过group by子句经过分类。
例如:
select name,max(age) from user;
这行sql在mysql里面是可以正常执行的,但是在oracle里面不能执行。
select name,max(age) from user group by name;
而经过加入group by 将列name进行分组之后就可以正常执行了。
空字符的处理
mysql非空字段的内容可以有空的内容,而oracle里面非空字段不容许有空的内容,因此导入数据的时候需要对空字符判断。
Mybatis JdbcType与Oracle、MySql数据类型对应列表
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>