1.mysql 与 oracle数据类型对比表
oracle 与 java类型参考表
2. 表名和字段名的长度
- oracle不能超过30,mysql无这个限制
3. 字段默认值问题
-
MySQL创建表时,如果某字段定义为NOT NULL,并且没有明确定义default值,则insert时可以不填该字段,mysql会自动给它填一个0或者空串或者其他符合该字段类型的空值。当然如果该字段有明确defaut值,则会填入这个default值。
-
oracle创建表时,如果某字段定义为NOT NULL,并且没有明确定义default值,则insert时必需在sql语句中写值,否则报错(insert into失败)。
-
Mysql的字段默认值有四种:
未定义、自定义的值(包括空串’‘和’0’)、CURRENT_TIMESTAMP、0000-00-00 00:00:00
4. 索引问题
- oracle中的索引名不能重复,而mysql可以。
5. 自增字段问题
- 用sequence,需要修改系统框架的底层insert的实现,要显示地调用序列,类似于以下操作。
@Id
@SequenceGenerator(name="seq",sequenceName="ncl_visitor_state_SEQ",allocationSize=1)
@GeneratedValue(strategy= GenerationType.SEQUENCE,generator="seq")
6. 表空间问题
oracle表空间大小可能不超过32G,需要注意。
7. oracle 与mysql sql语句的区别
- oracle的sql中不能出现`(按键1的左边),但mysql中经常用它来括住表名。
- oracle表名和字段名,可以加双引号,也可以不加双引号,但不能加单引号;mysql对于 " 和 ’ 没什么区别。
- oracle字段的值如果字符串型,必需加单引号,但不能加双引号;
- 字段的值如果是数字,可以不加单引号,也可以加单引号,但一定不能加双引号。
- oracle对于大小写的表和字段是不一样的,会导致sql执行失败。mysql无大小写区别。
- oracle 关键字不能出现在sql语句中,会导致sql执行失败。
- 分页实现不一样:
//mysql
使用limit
select * from table limit (startPage-1)*pageSize,pageSize;
//limit m,n: m时offset偏移量,获取第m+1条到第m+n条数据。
//oracle-注意:使用rownum(虚拟列)判断时只能使用<,不能使用大于;而使用别名则无此限制。
SELECT * FROM
(
SELECT temp.*, ROWNUM RN
FROM (SELECT * FROM 表名) temp
WHERE ROWNUM <=end (page*pagesize)
)
WHERE RN >start((page-1)*pagesize) --这一种效率高,其他方法暂时不考虑了。
//而rn > m and rownum < n; 获取第m条到第n条数据。
FQA
- 1.ORA-01830: 日期格式图片在转换整个输入字符串之前结束
一定是其中一个字段或者属性的值出现类似于2005-10-01 12:01:01.0' 后面多了一个.0
//处理办法
去掉.0即可,to_char(),或者substr()都可以。
- 2.日期操作
SQL> select sysdate, sysdate+3 from dual; --增加三天
select sysdate, sysdate+numtodsinterval(1,'hour') from dual; --增加一个小时
select sysdate nowDate,to_date(sysdate+1/24,'yyyy-mm-dd hh24:mi:ss') searchDate from dual; --增加一个小时
select to_char(sysdate,'d') from dual; --获取一周内的第几天(需要-1);
select to_char(sysdate,'dd') from dual; --获取一月内的第几天
select to_char(sysdate,'ddd') from dual; --获取一年内的第几天(需要-1);
select sysdate nowDate,add_months(to_date(Sysdate,'yyyy-mm-dd hh24:mi:ss'),6) searchDate from dual;
- 3.group by select 字段要么在聚合函数中,要么在group by内,否则报错
select a-sum(s) from table group by a ; --a必须在group by内。
-
4.字段名不能使用单引号,要么不用,要么用双引号,区别无非就是大小写的问题。
-
5.oracle sql不能包括关键字:
譬如:
level ,comment,offline等oracle内置关键字。
- 6.true 和false 使用number(1) 代替:
0:false;1:true;
- 7.获取列的行号
//mysql是实现方式
select (@i:=@i+5) as rownum, surname, personal_name from student, (select @i:=100) as init;
//oracle
使用rownum即可
- 8.别名的用法
1. 在Oracle里,表的别名不能用as,列的别名可以用as
2. where,group by,having不能直接使用别名,需要使用子查询。
3. order by 可以使用别名
4. mysql中,group by,order by中可以使用别名;where中不能使用别名。
- 字段判断是否为空,并赋值问题
nvl2(ss,1,0) --ss为空,则为0,反之,则为1。