导读:接下来的网上商城的项目,需要用到MySQL数据库了。这个对于我来说,是一个新接触的东西,按照惯例,在刚开始学习一个东西的时候,先从宏观上去了解它。本篇博客,先介绍SQL Server的基本内容,然后介绍MySQL的基本内容,最后介绍两者之间的区别。
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用。
Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。
SQL Server的应用范围,和其具体的版本有一定的关系,基本上是:企业版(Enterprise Edition) (大中型企业商用);标准版(Standard Edition) (小型企业商用);开发版(Developer Edition) (开发公司、开发人员使用);个人版(Personal Edition) (开发人员使用);MSDE 2000(Microsoft SQL Server 2000 Desktop Engine)(简单的单机数据库、开发人员开发测试使用)
(1) 扩展性强:当系统要更高数据库处理速度时,只要简单地增加数据库服务器就 可以得到扩展。
(2) 可维护性:当某节点发生故障时,系统会自动检测故障并转移故障节点的应用,保证数据库的持续工作。
(3) 安全性:因为数据会同步的多台服务器上,可以实现数据集的冗余,通过多份数据来保证安全性。另外它成功地将数据库放到了内网之中,更好地保护了数据库的安全性。
(4) 易用性:对应用来说完全透明,集群暴露出来的就是一个IP
(1) 不能够按照Web服务器的处理能力分配负载。
(2) 负载均衡器(控制端)故障,会导致整个数据库系统瘫痪。
增:insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)
删:delete from 数据表 where 条件表达式
改:update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式
查:select * from 数据表 where 字段名=字段值 order by 字段名 [desc]
MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言。
Web网站系统:安装配置简单,性能优越,开源。
日志管理系统:高效的插入和查询功能,如果设计地较好,在使用MyISAM存储引擎的时候,两者可以做到互不锁定,达到很高的并发性能。
数据仓库系统:在急需大量存储的空间和高效率的数据分析的需求下,目前基本有三种方式可以解决这一问题:1,采用昂贵的高性能主机以提高计算性能,用高端存储设备提高I/O性能,效果理想,但是成本非常高;2,通过将数据复制到多台使用大容量硬盘的廉价pcserver上,以提高整体计算性能和I/O能力,效果尚可,存储空间有一定限制,成本低廉;,3,通过将数据水平拆分,使用多台廉价的pcserver和本地磁盘来存放数据,每台机器上面都只有所有数据的一部分,解决了数据量的问题,所有pcserver一起并行计算,也解决了计算能力问题,通过中间代理程序调配各台机器的运算任务,既可以解决计算性能问题又可以解决I/O性能问题,成本也很低廉。对于第二个和第三个,MySQL都有很大的优势(跨域的简单复制、免费)。
嵌入式系统:嵌入式环境对软件系统最大的限制是硬件资源非常有限,在嵌入式环境下运行的软件系统,必须是轻量级低消耗的软件。MySQL有专门针对嵌入式系统的版本。
1,支持5000万条记录的数据仓库;2,适应于所有的平台;3,是开源软件,版本更新较快;4,性能很出色。纯粹就性能而言,MySQL是相当出色的,因为它包含一个缺省桌面格式MyISAM。MyISAM 数据库与磁盘非常地兼容而不占用过多的CPU和内存。MySQL可以运行于Windows系统而不会发生冲突,在UNIX或类似UNIX系统上运行则更好。可以通过使用64位处理器来获取额外的一些性能。因为MySQL在内部里很多时候都使用64位的整数处理;5,价格便宜
缺点: 缺乏一些存储程序的功能,不支持陌生的关键字,采用缺省的端口IP(也是优点),容易被黑客侵入。MyISAM(MySQL的默认存储引擎,另一个是innoDB)并不支持事务处理。
MySQL的基本语法和SQL Server基本相同。
联系:都是属于关系型的数据库,都是目前的主流数据库,其基本操作语法相同。
区别:最大的区别就是,MySQL是开源的。开源的,意味着什么?
SQL Server数据库和MySQL数据库有什么区别呢?详细很多初入IT行业的朋友对于SQL Server数据库和MySQL数据库经常搞混,认为这两种数据库是同一种,其实不然,今天我们来分析一下这两种数据库的不同之处:
SQL Server数据库和MySQL数据库有什么区别
1,优点分析:MYSQL短小精悍,容易上手,操作简单,免费供用的。相对其它数据库有特色又实用的语法多一些。SQL怎么也算是大型数据库,稳定,能做一般大系统的数据仓库,运行速度明显比MYSQL快N多(海量数据下这个优势显而易见)。
2,缺点分析:MYSQL难担当大系统的数据仓库,运行速度慢,不够稳定,有掉线的情况。SQLSERVER价格贵(当然没说5元盗版),使用起来比MYSQL要难一些,毕竟东西大了说道多点。
3,按你的补充(如何登录):MySQL自己有文字界面客户端,用起来咋说也没鼠标点方便(不过习惯了也好),当然配对MYSQL有专业的客户端软件,我是用SQLYOG519版的,各种操作真的是很方便的说。SQLSERVER 就用自带的查询分析器登录了:)两者的前提是数据库服务都带打开,而且你得知道安装时的用户名密码哦:)
对于程序开发人员而言,目前使用最流行的两种后台数据库即为MySQL and SQLServer。这两者最基本的相似之处在于数据存储和属于查询系统。你可以使用SQL来访问这两种数据库的数据,因为它们都支持ANSI-SQL。还有,这两种数据库系统都支持二进制关键词和关键索引,这就大大地加快了查询速度。同时,二者也都提供支持XML的各种格式。除了在显而易见的软件价格上的区别之外,这两个产品还有什么明显的区别吗?在这二者之间你是如何选择的?让我们看看这两个产品的主要的不同之处,包括发行费用,性能以及它们的安全性。
根本的区别是它们遵循的基本原则
二者所遵循的基本原则是它们的主要区别:开放vs保守。SQL服务器的狭隘的,保守的存储引擎与MySQL服务器的可扩展,开放的存储引擎绝然不同。虽然你可以使用SQL服务器的Sybase引擎,但MySQL能够提供更多种的选择,如MyISAM,Heap, InnoDB, and BerkeleyDB。MySQL不完全支持陌生的关键词,所以它比SQL服务器要少一些相关的数据库。同时,MySQL也缺乏一些存储程序的功能,比如MyISAM引擎联支持交换功能。
发行费用:MySQL不全是免费,但很便宜
当提及发行的费用,这两个产品采用两种绝然不同的决策。对于SQL服务器,获取一个免费的开发费用最常的方式是购买微软的Office或者VisualStudio的费用。但是,如果你想用于商业产品的开发,你必须还要购买SQL Server StandardEdition。学校或非赢利的企业可以不考虑这一附加的费用。
性能:先进的MySQL
纯粹就性能而言,MySQL是相当出色的,因为它包含一个缺省桌面格式MyISAM。MyISAM数据库与磁盘非常地兼容而不占用过多的CPU和内存。MySQL可以运行于Windows系统而不会发生冲突,在UNIX或类似UNIX系统上运行则更好。你还可以通过使用64位处理器来获取额外的一些性能。因为MySQL在内部里很多时候都使用64位的整数处理。Yahoo!商业网站就使用MySQL作为后台数据库。
当提及软件的性能,SQL服务器的稳定性要比它的竞争对手强很多。但是,这些特性也要付出代价的。比如,必须增加额外复杂操作,磁盘存储,内存损耗等等。如果你的硬件和软件不能充分支持SQL服务器,我建议你最好选择其他如DBMS数据库,因为这样你会得到更好的结果。
安全功能
MySQL有一个用于改变数据的二进制日志。因为它是二进制,这一日志能够快速地从主机上复制数据到客户机上。即使服务器崩溃,这一二进制日志也会保持完整,而且复制的部分也不会受到损坏。
在SQL服务器中,你也可以记录SQL的有关查询,但这需要付出很高的代价。
安全性
这两个产品都有自己完整的安全机制。只要你遵循这些安全机制,一般程序都不会出现什么问题。这两者都使用缺省的IP端口,但是有时候很不幸,这些IP也会被一些黑客闯入。当然,你也可以自己设置这些IP端口。
恢复性:先进的SQL服务器
恢复性也是MySQL的一个特点,这主要表现在MyISAM配置中。这种方式有它固有的缺欠,如果你不慎损坏数据库,结果可能会导致所有的数据丢失。然而,对于SQL服务器而言就表现得很稳键。SQL服务器能够时刻监测数据交换点并能够把数据库损坏的过程保存下来。
根据需要决定你的选择
对于这两种数据库,如果非要让我说出到底哪一种更加出色,也许我会让你失望。以我的观点,任一对你的工作有帮助的数据库都是很好的数据库,没有哪一个数据库是绝对的出色,也没有哪一个数据库是绝对的差劲。我想要告诉你的是你应该多从你自己的需要出发,即你要完成什么样的任务?而不要单纯地从软件的功能出发。
如果你想建立一个.NET服务器体系,这一体系可以从多个不同平台访问数据,参与数据库的管理,那么你可以选用SQL服务器。如果你想建立一个第三方站点,这一站点可以从一些客户端读取数据,那么MySQL将是最好的选择。
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 是 Microsoft推出一套产品,它具有使用方便、可伸缩性好、与相关软件集成程度高等优点,逐渐成为Windows平台下进行数据库应用开发较为理想的 选择之一。SQLServer是目前流行的数据库之一,它已广泛应用于金融、保险、电力、行政管理等与数据库有关的行业。而且,由于其易操作性及友好的界 面,赢得了广大用户的青睐,尤其是SQLServer与其它数据库,如Access、FoxPro、Excel等有良好的ODBC接口,可以把上述数据库 转成SQLServer的数据库,因此目前越来越多的读者正在使用SQLServer。
SQL Server由于是微软的产品,又有着如此强大的功能,所以他的影响力是几种数据库系统中比较大,用户也是比较多的。它一般是和同是微软产品的.net平台一起搭配使用。当然其他的各种开发平台,都提供了与它相关的数据库连接方式。因此,开发软件用SQL Server做数据库是一个正确的选择。
MySQL不支持事务处理,没有视图,没有存储过程和触发器,没有数据库端的用户自定义函数,不能完全使用标准的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多个数据库多个用户形式(最好每个数据库对应一个用户)
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里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。
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主键生成策略即可。
SQL,在这里我理解成SQL Server。三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性。排行第四的DB2(属IBM公司),与Oracle的定位和架构非常相似,就不赘述了。
1.有些人说Oracle没有限制,实际上他们说得可能是Oracle不支持LIMIT语法。不过可以rownum虚列来实现,不过会更加麻烦。
2. Oracle不支持偏移(偏移)语法。
3. Oracle的复制功能可能比MySQL更加健壮,不过也更加难以配置。
4.对于多个Master类型的系统,大部分用户都希望你使用更加复杂也更加昂贵的Oracle RAC(虽然可能NDB更加健壮)。
5. Oracle的分区功能非常健壮,但是它不是内置的,并需要专门为此付费(分区功能是在Enterprise Edition里面是内置的)。
6.在Linux / Unix上,Oracle并不象Mysql那么方便,很多Linux / Unix发行版默认就会自带Mysql。(我对这一点的理解与翻译可能都有偏差)7。INSERT
... ON DUPLICATE KEY UPDATE语法将不再可用,不过你需要学习更加复杂(但是符合SQL标准)的MERGE语法。
8. Oracle的ROLE架构与MySQL有很大差异,无法再使用root角色来完整所有工作。(不过Sys用户的权限仍然与root相差无几,只是为了安全着想,不建议这么使用了)。
9.角色帐户与特定的Schema联系在一起(反之也一样),类似于MySQL数据库中的数据库概念。(角色并不完全与Schema联系在一起,系统有一些固定的角色,这些角色包含部分已经定义好的权限集(privilege set),也可以再自定义部分新的角色)。
10.事实上,丢弃一切已知的关于连接访问的设置吧,Oracle使用一套全新的系统来处理连接访问。
11.支持全文搜索,不过语法完全不同。
12. Oracle的文档非常丰富,不过,如果需要Oracle的专业服务,你需要拥有Metalink的访问权限。
13.在非数据库社区很难找到相关的支持信息(例如,PHP论坛或者网站开发者的网志)
14。自增功能可以通过Trigger与sequ??ence对象来实现。
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 *或者插入表
值来处理数据,而不是在选择,插入中指定具体需要处理的字段名列表)。
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的外部表(外部表)确实是支持csv格式的,在11g版本中还支持对此文件的压缩/加密以及其他处理)。
26. Oracle中的Group By语句必须是确定的,它需要从列句中选择列出中出现的所有列都必须包含在group中。
27. Oracle的exp命令输出的dmp文件无法象Mysql的转储文件一样可以手工修改。
28. Oracle的底层实现有较大变化,需要你学习UNDO与REDO段,归档,以及DBWR进程。(个人认为甲骨文相对于其他数据库的主要的优势可能就是其撤消/重做的设计了。)
29. Oracle不是开源软件,因此你无法在上面进行修补/优化/修复/实现你自己的东西。
Robert Hodges
30. Oracle的查询优化是一件需要专家介入的工作。它的优化器比MySQL的要成熟的多,这意味着查询计划也相应的更加难以解释。如果你有一个大的应用,请准备好聘用一位了解如何有效进行此项工作的伙计。
31. Oracle的基于成本的优化器的有效运行需要精确的统计信息。对于发生变化的表,需要定期的为其收集统计信息。批量数据加载进程也需要在处理过程中不时的执行估算/计算统计命令来收集统计信息以取得满意的性能。
32.在Oracle中,创建连接是个代价高昂的操作。性能良好的Oracle应用都倾向于使用连接池来最小化登陆的开销。
33. Oracle应用需要应用准备好的声明以获取可观的性能。如果你的应用不使用prepared statement的话,需要对应用进行调整。这是应用Oracle数据库的标准编程实践。(此处的预备声明应该更多的是指使用绑定变量)。
34.应用需要关闭结果集游标,否则很快就会遇到着名的“ORA-01000太多打开游标”错误。在Oracle中,这被认为是一个用户错误,需要你去调整你的代码。
35.繁忙系统上的长查询可能会遇到“ORA-01555快照太旧”错误。可以通过调整redo段的大小(有时通过调整应用)来消除此错误,但是还是需要你关注这一点。处的重做段的表述是有点问题,此处应该是撤消表空间以及对应的撤消
保留,Oracle没有所谓的重做段的说法)。
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在语句中不支持使用减号( - )。(不清楚这个具体的减号是什么东西)。
42. Oracle的sqlplus命令行接口不支持高亮显示。
罗兰布曼
43. Oracle不支持group_concat或者类似的分组函数。需要你通过循环调取游标来实现,或者通过组合XMLAGG与XMLQUERY来实现你需要的查询。(在Oracle 9R2之后,可以使用自定义聚合函数来实现这个功能,到Oracle 11gR1之后,Oracle自己还提供了一个新的listagg分组函数来实现这个功能)。
44.对于count(distinct expression)函数,Oracle只支持一个表达式(要么一个列名,要么*),而Mysql支持一组表达式。(在甲骨文中要实现一组表达式,可以通过使用子查询来实现)。
45. Oracle对子查询的支持非常好。不要因为Mysql中的习惯而不去使用它。
46. Oracle不支持用户变量(@num)。如果你需要利用它来计算运行时总和,可以利用分析函数(窗口函数)来实现。如果用户户变量来实现特定的汇总函数功能,你将发现Oracle已经有内置得功能支持这些功能。(另外在甲骨文中,可以通过在封装中应用DBMS_SESSION来设置上下文以实现用户变量)。
47. Oracle没有区分TIME与DATE类型,Oracle的日期类型实际上就是一个DATETIME类型(但是比MySQL支持一个更大的日期范围)。
48.相对于MySQL来讲,Oracle的存储过程与触发器功能与性能都要好很多。不要习惯性地不去使用它们。
49.如果需要在Oracle中编写存储过程,记得在开始编码前花点时间了解下。你将发现大部分问题已经解决掉了,或者至少大量的基础代码已经在那儿了。
50如果你在MySQL中有使用BLOB类型或者TEXT类型,你可能会将他们迁移到Oracle地图BLOB与CLOB中。然而,与MySQL不同,Oracle并不是透明地实体化这些数据。在大部分情况下,这确实是件好事情,但是它也意味着如果你只是想把BLOB / CLOB当作文本处理,你将需要花费大量琐碎的时间来使用LOB函数,在使用之初,LOB函数还是蛮让人气馁的(LOB相关函数确实挺烦人,LOB的处理效率也非常差,即使是使用Oracle
11g的SecureFile)。