1.前言
工作中使用Oracle较多。但是与MySQL日常练手也多。计划写一个系列将Oracle使用过程中遇到的技巧 使用方法都列出来。包括存储过程、触发器PLSQL、策略、临时表。后续慢慢补充
2. 对比区别
1.就是最常用的端口:MySQL 3306 Oracle 1521
2.登录时候的命令行
MySQL mysql -u用户 -p密码 -P端口号 -D数据库名
Oracle sqlplus user/password@ip:port/instance_name。
Oracle 有如下几种
sqlplus sys/sys as sysdba
sqlplus scott/tiger@192.168.10.145/orcl 普通用户登录
sqlplus scott/tiger@oracle_0913 服务名
sqlplus scott/tiger
3.mysql默认用户是root,用户可以创建多个数据库,每个数据库下可以有多张表,一般情况下都是使用默认用户,不会创建多个用户;
oracle是单实例,一个数据库下有多个用户,不同用户具有多张表。
- 这个是什么意思呢,就是对于开发来理解就是MySQL日常操作的是数据库,创建的数据库怎样怎样。但是Oracle就只有一个数据库。然后日常操作的是用户创建的表。这个初学的时候容易用户和数据库分不清,需要理解清楚概念。
- MySQL也有用户,不过这里面用户的概念就不涉及到表,仅涉及到权限之类的
4.表字段类型不同
①mysql的整数类型有单字节的tinyint、双字节的smallint、三字节的mediumint、四字节的int或integer、八字节的bigint,浮点类型有四字节的float和八字节的double,日期类型有date、time、year、datetime、timestamp,字符类型有char、varchar、text。
②oracle的数值类型是number,字符类型有char、varchar、varchar2,日期型有date等。
- oracle里面的number类型很有讲究。两个参数。精度和小数。日常中金额就是使用number(18,2);
- 有些情况存储一些大文件可以使用blob之类的 。就是将文件存储进数据库,当然一般不推荐,推荐放入到文件服务器上面
5.安装使用的空间不同。oracle比较占用空间 。几个G。MySql占用几百兆,
6.单引号的处理
Mysql里可以用“双引号”包起字符串,Oracle里只可以用“单引号”包起字符串
7.自动增长的数据类型处理
①Mysql是一个自动增长的数据类型,插入数据时候,不需要管理,它自己会自动增长
②Oracle不支持自动增长数据类型,通过建立一个自动增长的序列号来完成自动增长。
8.事务的提交级别
隔离级别有四种
读未提交
读已提交
可重复读
可串行话
Oracle的事务隔离级别有两种:
①READ COMMITTED :读已提交、
②SERIALIZABLE:串行读取
- MySQL默认的隔离级别比Oracle要高。体现在日常开发中有。oracle开发更改完数据之后需要在手动提交一下数据。
- 为了提高并发MySQL有mvcc多版本并发机制,有很多可以唠的东西
9.临时表的区别
MySQL中,临时表是仅对当前用户会话可见的数据库对象,并且一旦会话结束,这些表将自动删除。
Oracle中临时表的定义与MySQL略有不同,因为临时表一旦创建就会存在,直到它们被显式删除,并且对具有适当权限的所有会话都可见。但是,临时表中的数据仅对将数据插入表中的用户会话可见,并且数据可能在事务或用户会话期间持续存在。
10.备份的过程
Oracle提供不同类型的备份工具,如冷备份,热备份,导出,导入,数据泵。Oracle提供了最流行的称为Recovery Manager(RMAN)的备份实用程序。使用RMAN,我们可以使用极少的命令或存储脚本自动化我们的备份调度和恢复数据库。
MySQL有mysqldump和mysqlhotcopy备份工具。在MySQL中没有像RMAN这样的实用程序。
11.长字符串处理
长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字符,
如果要插入更长的字符串,请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度值都应该提出警告,返回上次操作。
12.oracle序列
数据库表中的主键值有的时候我们会用数字类型的并且自增。这样mysql、sql server中的都可以使用工具创建表的时候很容易实现。但是oracle中没有设置自增的方法,一般情况我们会使用序列和触发器来实现主键自增的功能。
-- Create sequence
create sequence SEQ_TEST
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
cache 20;
CREATE SEQUENCE sequence //创建序列名称
[INCREMENT BY n] //递增的序列值是 n 如果 n 是正数就递增,如果是负数就递减 默认是 1
[START WITH n] //开始的值,递增默认是 minvalue 递减是 maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存入到内存中