1. 有些人说Oracle没有限制,实际上他们说得多是Oracle不支持LIMIT语法.不过能够rownum虚列来实现,不过会更加麻烦. php
2. Oracle不支持偏移(offset)语法. mysql
3. Oracle的复制功能可能比MySQL更加健壮,不过也更加难以配置. linux
4. 对于多个Master类型的系统,大部分用户都但愿你使用更加复杂也更加昂贵的Oracle RAC(虽然可能NDB更加健壮). web
5. Oracle的分区功能很是健壮,可是它不是内置的,并须要专门为此付费(分区功能是在Enterprise Edition里面是内置的). sql
6. 在Linux/Unix上,Oracle并不象Mysql那么方便,不少Linux/Unix发行版默认就会自带Mysql.(我对这一点的理解与翻译可能都有误差) 数据库
7. INSERT … ON DUPLICATE KEY UPDATE语法将再也不可用,不过你须要学习更加复杂(可是符合SQL标准)的MERGE语法. express
8. Oracle的ROLE架构与MySQL有很大差别,没法再使用root角色来完整全部工做.(不过Sys用户的权限仍然与root相差无几,只是为了安全着想,不建议这么使用了). 编程
9. Role 账户与特定的Schema联系在一块儿(反之也同样),相似于MySQL数据库中的Database概念.(Role并不彻底与Schema联系在一块儿,系统有一些固定的role,这些Role包含部分已经定义好的权限集(privilege set),也能够再自定义部分新的role). 安全
10. 事实上,丢弃一切已知的关于链接访问的设置吧,Oracle使用一套全新的系统来处理链接访问. 服务器
11. 支持全文搜索,不过语法彻底不一样.
12. Oracle的文档很是丰富,不过,若是须要Oracle的专业服务,你须要拥有Metalink的访问权限.
13. 在非数据库社区很难找到相关的支持信息(例如,PHP论坛或者网站开发者的网志)
14. 自增功能能够经过Trigger与sequence对象来实现.
15. 大量平常熟悉的SHOW命令将再也不可用,想要获取系统信息,须要你学习Oracle的数据字典(或信息Schema),深刻一点的还须要学习Oracle动态性能.
16. MySQL为信息Schema添加了多个非标准的扩展,在Oracle中将很难找到这些信息.
17. 为了管理好生产系统与非生产系统的的转入转出,须要你深刻理解Oracle的受权规则.
18. 大致上讲,Oracle的数值类型更加简单,若是你确实须要相似于MySQL的多粒度的数值类型,就须要你本身来实现它,或者经过制定不一样的精度(Number(n,x))来实现.
19. 在Oracle中,表能够作到无限制的增加,可是大部分状况下,都建议经过表空间(tablespace)来对此做细粒度的管理.
20. Oracle不支持ALTER TABLE ADD COLUMN BEFORE|AFTER,也就是不支持本身制定字段的位置.(咱们这边以前有部分应用对字段顺序有严格地要求,不过,从理论上讲,这是业务设计的问题,主要是其大部分状况下都是使用select *或者insert table values来处理数据,而不是在select,insert中指定具体须要处理的字段名列表).
21. 若是你习惯于经过图形界面(GUI)来管理数据库,你必定会喜欢上Oracle,可是若是你倾向于使用相似与Mysql 命令行的客户端,你可能会对sql*plus这个客户端工具感到失望(须要一个习惯的过程,sql*plus仍是蛮好用的).
22. Oracle的数据校验比Mysql更加严格,依赖于MySQL的模糊规则可能会致使应用没法运行.MySQL接受”0000-00-00″来做为日期类型的值就是个典型的例子.
23. 虽然Oracle的PL/SQL功能更强,可是它不支持标准的PSM语言来编写存储过程,所以你可能不得不学习它的非标准的语法.
24. Oracle不支持ENUM数据类型,只能经过使用基于文本的check约束或者建立外键关联表来实现.
25. Mysql的一些更加神秘的表类型(例如,blackhole,csv),在Oracle中找不到相对应的功能. (不清楚blockhole是何种类型,不过Oracle的外部表(external table)确实是支持csv格式的,在11g版本中还支持对此文件的压缩/加密以及其余处理).
26. Oracle中的Group By语句必须是肯定的,它须要select list中出现的全部列都必须包含在group by从句中.
27. Oracle的exp命令输出的dmp文件没法象Mysql的转储文件同样能够手工修改.
28. Oracle的底层实现有较大变化,须要你学习UNDO与REDO segment,归档,以及DBWR进程. (我的认为Oracle相对于其余数据库的主要的优点可能就是其UNDO/REDO的设计了.)
29. Oracle不是开源软件,所以你没法在上面进行修补/优化/修复/实现你本身的东西.
Robert Hodges
30. Oracle的查询优化是一件须要专家介入的工做.它的优化器比MySQL的要成熟的多,这意味着查询计划也相应的更加难以解释.若是你有一个大的应用,请准备好聘用一位了解如何有效进行此项工做的伙计.
31. Oracle的基于成本的优化器的有效运行须要精确的统计信息.对于发生变化的表,须要按期的为其收集统计信息.批量数据加载进程也须要在处理过程当中不时的执行estimate/compute statistics命令来收集统计信息以取得满意的性能.
32. 在Oracle中,建立链接是个代价高昂的操做.性能良好的Oracle应用都倾向于使用链接池来最小化登录的开销.
33. Oracle应用须要应用prepared statement以获取可观的性能.若是你的应用不使用prepared statement的话,须要对应用进行调整.这是应用Oracle数据库的标准编程实践.(此处的prepared statement应该更多的是指使用绑定变量).
34. 应用须要关闭结果集游标,不然很快就会遇到著名的”ORA-01000 Too many open cursors”错误.在Oracle中,这被认为是一个用户错误,须要你去调整你的代码.
35. 繁忙系统上的长查询可能会遭遇到” ORA-01555 Snapshot too old”错误.能够经过调整redo 段的大小(有时经过调整应用)来消除此错误,可是仍是须要你关注这一点.(此处的redo segments的表述是有点问题,此处应该是Undo tablespace以及对应的Undo Retention,Oracle没有所谓的redo segment的说法).
36. Oracle没有相似于非事务表的概念.大部分Oracle用户都承认这一点.
37. Oracle的临时表定义是持久的SQL对象,而且对全部用户均可见(此处应该理解成以此用户登录的会话,Session).这一点与MySQL中使用的轻量级表有区别,在MySQL中,临时表是在单个会话内建立并销毁的.
Denish Patel
38. 在Oracle中,多个Alter Table操做不能在同一个SQL语句中执行,例如alter table emp modify name varchar(64) not null, add gender char(1) not null;
39. 默认状况下,Oracle不会自动提交.
40. KILL命令在Oracle中无效,它使用alter system kill命令.(不清楚第一个kill是什么概念,操做系统级别的kill,Oracle仍是支持的,我常用).
41. Oracle在Order by语句中不支持使用减号(-).(不清楚这个具体的减号是什么东西).
42. Oracle的sqlplus命令行接口不支持高亮显示.
Roland Bouman
43. Oracle不支持group_concat或者相似的分组函数.须要你经过循环调取游标来实现,或者经过组合XMLAGG与XMLQUERY来实现你须要的查询.(在Oracle 9R2以后,可使用自定义聚合函数来实现这个功能,到Oracle 11gR1以后,Oracle本身还提供了一个新的listagg分组函数来实现这个功能).
44. 对于count(distinct expression)函数,Oracle只支持一个表达式(要么一个列名,要么*),而Mysql支持一组表达式. (在Oracle中要实现一组表达式,能够经过使用子查询来实现).
45. Oracle对子查询的支持很是好.不要由于Mysql中的习惯而不去使用它.
46. Oracle不支持用户变量(@num).若是你须要利用它来计算运行时总和,能够利用分析函数(窗口函数)来实现.若是用用户变量来实现特定的汇总函数功能,你将发现Oracle已经有内置得功能支持这些功能.(另外在Oracle中,能够经过在package中应用dbms_session来设置context以实现用户变量).
47. Oracle没有区分TIME与DATE类型,Oracle的Date类型实际上就是一个DATETIME类型(可是比MySQL支持一个更大的日期范围).
48. 相对于MySQL来说,Oracle的存储过程与触发器功能与性能都要好不少.不要习惯性地不去使用它们.
49. 若是须要在Oracle中编写存储过程,记得在开始编码前花点时间了解下Oracle是否是有相应的内置package.你将发现大部分问题已经解决掉了,或者至少大量的基础代码已经在那儿了.
50 若是你在MySQL中有使用BLOB类型或者TEXT类型,你可能会将他们迁移到Oracle地BLOB与CLOB中.然而,与MySQL不一样,Oracle并非透明地实体化这些数据.在大部分状况下,这确实是件好事情,可是它也意味着若是你只是想把BLOB/CLOB看成文本处理,你将须要花费大量琐碎的时间来使用LOB函数,在使用之初,LOB函数仍是蛮让人气馁的.(LOB相关函数确实挺烦人,LOB的处理效率也很是差,即便是使用Oracle 11g的SecureFile).
1. Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格很是高。
1、并发性
并发性是oltp数据库最重要的特性,但并发涉及到资源的获取、共享与锁定。
mysql:
mysql以表级锁为主,对资源锁定的粒度很大,若是一个session对一个表加锁时间过长,会让其余session没法更新此表中的数据。
虽然InnoDB引擎的表能够用行级锁,但这个行级锁的机制依赖于表的索引,若是表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。
oracle:
oracle使用行级锁,对资源锁定的粒度要小不少,只是锁定sql须要的资源,而且加锁是在数据库中的数据行上,不依赖与索引。因此oracle对并发性的支持要好不少。
2、一致性
oracle:
oracle支持serializable的隔离级别,能够实现最高级别的读一致性。每一个session提交后其余session才能看到提交的更改。oracle经过在undo表空间中构造多版本数据块来实现读一致性,
每一个session查询时,若是对应的数据块发生变化,oracle会在undo表空间中为这个session构造它查询时的旧的数据块。
mysql:
mysql没有相似oracle的构造多版本数据块的机制,只支持read commited的隔离级别。一个session读取数据时,其余session不能更改数据,但能够在表最后插入数据。
session更新数据时,要加上排它锁,其余session没法访问数据。
3、事务
oracle很早就彻底支持事务。
mysql在innodb存储引擎的行级锁的状况下才支持事务。
4、数据持久性
oracle
保证提交的数据都可恢复,由于oracle把提交的sql操做线写入了在线联机日志文件中,保持到了磁盘上,
若是出现数据库或主机异常重启,重启后oracle能够考联机在线日志恢复客户提交的数据。
mysql:
默认提交sql语句,但若是更新过程当中出现db或主机重启的问题,也许会丢失数据。
5、提交方式
oracle默认不自动提交,须要用户手动提交。
mysql默认是自动提交。
6、逻辑备份
oracle逻辑备份时不锁定数据,且备份的数据是一致的。
mysql逻辑备份时要锁定数据,才能保证备份的数据是一致的,影响业务正常的dml使用。
7、热备份
oracle有成熟的热备工具rman,热备时,不影响用户使用数据库。即便备份的数据库不一致,也能够在恢复时经过归档日志和联机重作日志进行一致的回复。
mysql:
myisam的引擎,用mysql自带的mysqlhostcopy热备时,须要给表加读锁,影响dml操做。
innodb的引擎,它会备份innodb的表和索引,可是不会备份.frm文件。用ibbackup备份时,会有一个日志文件记录备份期间的数据变化,所以能够不用锁表,不影响其余用户使用数据库。但此工具是收费的。
innobackup是结合ibbackup使用的一个脚本,他会协助对.frm文件的备份。
8、sql语句的扩展和灵活性
mysql对sql语句有不少很是实用而方便的扩展,好比limit功能,insert能够一次插入多行数据,select某些管理数据能够不加from。
oracle在这方面感受更加稳重传统一些。
9、复制
oracle:既有推或拉式的传统数据复制,也有dataguard的双机或多机容灾机制,主库出现问题是,能够自动切换备库到主库,但配置管理较复杂。
mysql:复制服务器配置简单,但主库出问题时,丛库有可能丢失必定的数据。且须要手工切换丛库到主库。
10、性能诊断
oracle有各类成熟的性能诊断调优工具,能实现不少自动分析、诊断功能。好比awr、addm、sqltrace、tkproof等
mysql的诊断调优方法较少,主要有慢查询日志。
11、权限与安全
mysql的用户与主机有关,感受没有什么意义,另外更容易被仿冒主机及ip有可乘之机。
oracle的权限与安全概念比较传统,中规中矩。
12、分区表和分区索引
oracle的分区表和分区索引功能很成熟,能够提升用户访问db的体验。
mysql的分区表还不太成熟稳定。
十3、管理工具
oracle有多种成熟的命令行、图形界面、web管理工具,还有不少第三方的管理工具,管理极其方便高效。
mysql管理工具较少,在linux下的管理工具的安装有时要安装额外的包(phpmyadmin, etc),有必定复杂性。
1.组函数用法规则
mysql中组函数在select语句中能够随意使用,但在oracle中若是查询语句中有组函数,那其余列名必须是组函数处理过的,或者是group by子句中的列不然报错
eg:
select name,count(money) from user;这个放在mysql中没有问题在oracle中就有问题了。
2.自动增加的数据类型处理
MYSQL有自动增加的数据类型,插入记录时不用操做此字段,会自动得到数据值。ORACLE没有自动增加的数据类型,须要创建一个自动增加的序列号,插入记录时要把序列号的下一个值赋于此字段。
CREATE SEQUENCE序列号的名称(最好是表名+序列号标记)INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的长度来定,若是定义的自动增加的序列号NUMBER(6),最大值为999999
INSERT语句插入这个字段值为:序列号的名称.NEXTVAL
3.单引号的处理
MYSQL里能够用双引号包起字符串,ORACLE里只能够用单引号包起字符串。在插入和修改字符串前必须作单引号的替换:把全部出现的一个单引号替换成两个单引号。
4.翻页的SQL语句的处理
MYSQL处理翻页的SQL语句比较简单,用LIMIT开始位置,记录个数;PHP里还能够用SEEK定位到结果集的位置。ORACLE处理翻页的SQL语句就比较繁琐了。每一个结果集只有一个ROWNUM字段标明它的位置,而且只能用ROWNUM<100,不能用ROWNUM>80。
如下是通过分析后较好的两种ORACLE翻页SQL语句(ID是惟一关键字的字段名):
语句一:
SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;
语句二:
SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (select [FIELD_NAME,...] FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;
5.长字符串的处理
长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操做的字符串长度小于等于4000个单字节,若是要插入更长的字符串,请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前必定要作进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操做。
6.日期字段的处理
MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为SYSDATE,精确到秒,或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)年-月-日24小时:分钟:秒的格式YYYY-MM-DD HH24:MI:SS TO_DATE()还有不少种日期格式,能够参看ORACLE DOC.日期型字段转换成字符串函数TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’)
日期字段的数学运算公式有很大的不一样。MYSQL找到离当前时间7天用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE - 7;
MYSQL中插入当前时间的几个函数是:NOW()函数以`'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,能够直接存到DATETIME字段中。CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,能够直接存到DATE字段中。CURTIME()以’HH:MM:SS’的格式返回当前的时间,能够直接存到TIME字段中。例:insert into tablename (fieldname) values (now())
而oracle中当前时间是sysdate
7.空字符的处理
MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不允许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构,导数据的时候会产生错误。所以导数据时要对空字符进行判断,若是为NULL或空字符,须要把它改为一个空格的字符串。
8.字符串的模糊比较
MYSQL里用字段名like%‘字符串%’,ORACLE里也能够用字段名like%‘字符串%’但这种方法不能使用索引,速度不快,用字符串比较函数instr(字段名,‘字符串’)>0会获得更精确的查找结果。
9.程序和函数里,操做数据库的工做完成后请注意结果集和指针的释放。