Oracle
Oracle 能在所有支流平台上运行(包含Windows)。齐全反对所有的工业规范。采纳齐全凋谢策略。能够使客户抉择最适宜的解决方案。对开发商全力支持,Oracle并行服务器通过使一组结点共享同一簇中的工作来扩大Windows NT的能力,提供高可用性和高伸缩性的簇的解决方案。如果Windows NT不能满足需要,用户能够把数据库移到UNIX中。Oracle的并行服务器对各种UNIX平台的集群机制都有着相当高的集成度。Oracle取得最高认证级别的ISO规范认证.Oracle性能最高,放弃开放平台下的TPC-D和TPC-C的世界记录Oracle多层次网络计 算,反对多种工业规范,能够用ODBC、JDBC、OCI等网络客户连贯。
Oracle 在兼容性、可移植性、可联结性、高生产率上、开放性也存在长处。Oracle产品采纳规范SQL,并通过美国国家标准技术所(NIST)测试。与 IBM SQL/DS,DB2,INGRES,IDMS/R等兼容。 Oracle的产品可运行于很宽范畴的硬件与操作系统平台上。能够装置在70种以上 不同的大、中、小型机上;可在VMS、DOS、UNIX、WINDOWS等多种操作系统下工作。能与多种通信网络相连,反对各种协定(TCP/IP、 DECnet、LU6.2等)。提供了多种开发工具,能极大的不便用户进行进一步的开发。Oracle良好的兼容性、可移植性、可连接性和高生产率是 Oracle RDBMS具备良好的开放性。
Oracle价格是比拟低廉的。据说一套正版的Oracle软件早在2006年年底的时候在市场上的价格曾经达到了6位数。所以如果你的我的项目不是那种超级大的我的项目,还是放弃Oracle吧。
SQL Server
SQL Server 是 Microsoft推出一套产品,它具备使用方便、可伸缩性好、与相干软件集成水平低等长处,逐步成为Windows平台下进行数据库利用开发较为理想的 抉择之一。SQLServer是目前风行的数据库之一,它已广泛应用于金融、保险、电力、行政治理等与数据库无关的行业。而且,因为其易操作性及敌对的界 面,博得了宽广用户的青眼,尤其是SQLServer与其它数据库,如Access、FoxPro、Excel等有良好的ODBC接口,能够把上述数据库 转成SQLServer的数据库,因而目前越来越多的读者正在应用SQLServer。
SQL Server因为是微软的产品,又有着如此弱小的性能,所以他的影响力是几种数据库系统中比拟大,用户也是比拟多的。它个别是和同是微软产品的.net平台一起搭配应用。当然其余的各种开发平台,都提供了与它相干的数据库连贯形式。因而,开发软件用SQL Server做数据库是一个正确的抉择。
MySQL
MySQL不反对事务处理,没有视图,HP页游没有存储过程和触发器,没有数据库端的用户自定义函数,不能齐全应用规范的SQL语法。
从数据库里手据说的第一件事就是MySQL不足transactions,rollbacks, 和subselects的性能。如果你打算应用MySQL写一个对于银行、会计的应用程序,或者打算保护一些随时须要线性递增的不同类的计数器,你将不足transactions性能。在现有的公布版本的 MySQL下,请不要有任何的这些想法。(请留神,MySQL的测试版3.23.x系列当初曾经反对transactions了)。
在十分必要的状况下,MySQL的局限性能够通过一部分开发者的致力失去克服。在MySQL中你失去的次要性能是subselect语句,而这正是其它的所有数据库都具备的。换而言之,这个失去的性能是一个苦楚。
MySQL没法解决简单的关联性数据库性能,例如,子查问(subqueries),尽管大多数的子查问都能够改写成join
另一个MySQL没有提供反对的性能是事务处理(transaction)以及事务的提交(commit)/撤销(rollback)。一个事务指的是被当作一个单位来独特执行的一群或一套命令。如果一个事务没法实现,那么整个事务外面没有一个指令是真正执行上来的。对于必须解决线上订单的商业网站来说,MySQL没有反对这项性能,确实让人感觉很悲观。然而能够用MaxSQL,一个离开的服务器,它能通过外挂的表格来反对事务性能。
外键(foreignkey)以及参考完整性限度(referentialintegrity)能够让你制订表格中材料间的束缚,而后将束缚 (constraint)加到你所规定的材料外面。这些MySQL没有的性能示意一个有赖简单的材料关系的应用程序并不适宜应用MySQL。当咱们说 MySQL不反对外键时,咱们指的就是数据库的参考完整性限度--MySQL并没有反对外键的规定,当然更没有反对连锁删除(cascadingdelete)的性能。简短的说,如果你的工作须要应用简单的材料关联,那你还是用原来的Access吧。
你在MySQL中也不会找到存储过程(storedprocedure)以及触发器(trigger)。(针对这些性能,在Access提供了绝对的事件过程(eventprocedure)。
MySQL+php+apache三者被软件开发者称为“php黄金组合”。
Oracle和MySQL的次要区别
Oracle:客户端和命令窗口,都是由用户决定内容-> conn user_name/password;
MySQL:客户端和命令窗口,都是由数据库决定内容-> use datebase;
都能够创立多数据库多用户,集体偏向于Oracle一个数据库中多个用户的模式,MySQL多个数据库多个用户模式(最好每个数据库对应一个用户)
Oracle是大型数据库而MySQL是中小型数据库,Oracle市场占有率达40%,MySQL只有20%左右,同时MySQL是开源的而Oracle价格十分高。
Oracle反对大并发,大访问量,是OLTP(On-Line Transaction Processing联机事务处理零碎)最好的工具。
装置所用的空间差异也是很大的,MySQL装置完后才152M而Oracle有3G左右,且应用的时候Oracle占用特地大的内存空间和其余机器性能。
Oracle也与MySQL操作上的一些区别
组函数用法规定
MySQL中组函数在select语句中能够随便应用,但在Oracle中如果查问语句中有组函数,那其余列名必须是组函数解决过的,或者是group by子句中的列否则报错
eg:
select name,count(money) from user;这个放在MySQL中没有问题在Oracle中就有问题了。
主动增长的数据类型解决
MySQL有主动增长的数据类型,插入记录时不必操作此字段,会主动取得数据值。Oracle没有主动增长的数据类型,须要建设一个主动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。
CREATE SEQUENCE序列号的名称(最好是表名+序列号标记)INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的长度来定,如果定义的主动增长的序列号NUMBER(6),最大值为999999
INSERT语句插入这个字段值为:序列号的名称.NEXTVAL
单引号的解决
MySQL里能够用双引号包起字符串,Oracle里只能够用单引号包起字符串。在插入和批改字符串前必须做单引号的替换:把所有呈现的一个单引号替换成两个单引号。
翻页的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;
长字符串的解决
长字符串的解决Oracle也有它非凡的中央。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节,如果要插入更长的字符串,请思考字段用CLOB类型,办法借用Oracle里自带的DBMS_LOB程序包。插入批改记录前肯定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出正告,返回上次操作。
日期字段的解决
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
空字符的解决
MySQL的非空字段也有空的内容,Oracle里定义了非空字段就不容许有空的内容。按MySQL的NOT NULL来定义Oracle表构造,导数据的时候会产生谬误。因而导数据时要对空字符进行判断,如果为NULL或空字符,须要把它改成一个空格的字符串。
字符串的含糊比拟
MySQL里用字段名like%'字符串%',Oracle里也能够用字段名like%'字符串%'但这种办法不能应用索引,速度不快,用字符串比拟函数instr(字段名,'字符串')>0会失去更准确的查找后果。
程序和函数里,操作数据库的工作实现后请留神后果集和指针的开释。
主键
MySQL个别应用主动增长类型,在创立表时只有指定表的主键为auto increment,插入记录时,不须要再指定该记录的主键值,MySQL将主动增长;Oracle没有主动增长类型,主键个别应用的序列,插入记录时将序列号的下一个值付给该字段即可;只是ORM框架是只有是native主键生成策略即可。
Oracle实现了ANSIISQL中大部分性能,如,事务的隔离级别、流传个性等而MySQL在这方面还是比拟的弱