Mysql和oracle数据库分析.docx
《Mysql和oracle数据库分析.docx》由会员分享,可在线阅读,更多相关《Mysql和oracle数据库分析.docx(33页珍藏版)》请在冰点文库上搜索。
Mysql和oracle数据库分析
数据库分析
1.MySQL
MySQL是最受欢迎的开源SQL数据库管理系统,它由MySQLAB开发、发布和支持。
MySQLAB是一家基于MySQL开发人员的商业公司,它是一家使用了一种成功的商业模式来结合开源价值和方法论的第二代开源公司。
MySQL是MySQLAB的注册商标。
MySQL是一个快速的、多线程、多用户和健壮的SQL数据库服务器。
MySQL服务器支持关键任务、重负载生产系统的使用,也可以将它嵌入到一个大配置(mass-deployed)的软件中去。
与其他数据库管理系统相比,MySQL具有以下优势:
(1)MySQL是一个关系数据库管理系统。
(2)MySQL是开源的。
(3)MySQL服务器是一个快速的、可靠的和易于使用的数据库服务器。
(4)MySQL服务器工作在客户/服务器或嵌入系统中。
(5)有大量的MySQL软件可以使用。
2.Oracle
提起数据库,第一个想到的公司,一般都会是Oracle(甲骨文)。
该公司成立于1977年,最初是一家专门开发数据库的公司。
Oracle在数据库领域一直处于领先地位。
1984年,首先将关系数据库转到了桌面计算机上。
然后,Oracle5率先推出了分布式数据库、客户/服务器结构等崭新的概念。
Oracle6首创行锁定模式以及对称多处理计算机的支持……最新的Oracle8主要增加了对象技术,成为关系—对象数据库系统。
目前,Oracle产品覆盖了大、中、小型机等几十种机型,Oracle数据库成为世界上使用最广泛的关系数据系统之一。
Oracle数据库产品具有以下优良特性。
(1)兼容性
Oracle产品采用标准SQL,并经过美国国家标准技术所(NIST)测试。
与IBMSQL/DS、DB2、INGRES、IDMS/R等兼容。
(2)可移植性
Oracle的产品可运行于很宽范围的硬件与操作系统平台上。
可以安装在70种以上不同的大、中、小型机上;可在VMS、DOS、UNIX、Windows等多种操作系统下工作。
(3)可联结性
Oracle能与多种通讯网络相连,支持各种协议(TCP/IP、DECnet、LU6.2等)。
(4)高生产率
Oracle产品提供了多种开发工具,能极大地方便用户进行进一步的开发。
(5)开放性
Oracle良好的兼容性、可移植性、可连接性和高生产率使OracleRDBMS具有良好的开放性。
相同点
1.都是关系型数据库管理系统
2.目前最流行的数据库
不同点
优点
a.mysql的优点是开源免费、简单易用、稳定可靠、易于扩展都是非常不错的。
实际上,用MySQL支撑的google的数据库、Facebook的数据库、中移动飞信的数据库够大了吧,MySQL还是完成能够支撑一些大规模的应用的,尤其在互联网行业,MySQL的复制功能可以很方便的实现读写分离后的水平扩展
b.oracle的优点是有甲骨文公司强大的技术后盾,功能丰富和完善、安全、性能优异、人性化
缺点
a.mysql的缺点就是相对功能少,面向的对象是一般的小型网站或者系统,大型数据库很少用mysql;
b.oracle的缺点是对硬件的要求十分高,对管理人员的技术要求高。
基本上是这样了。
其他
a.MySQL是用C++; Oracle系统核心应该是用C写,从Oracle9i开始,Oracle正式采用java做为主要程序开发语言,很多Oracle客户端应用程序都将采用java来编写.
1.Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高。
2.Oracle支持大并发,大访问量,是OLTP最好的工具。
3.安装所用的空间差别也是很大的,Mysql安装完后才152M而Oracle有3G左右,且使用的时候Oracle占用特别大的内存空间和其他机器性能。
1.组函数用法规则
mysql中组函数在select语句中可以随意使用,但在oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的,或者是groupby子句中的列否则报错
eg:
selectname,count(money)fromuser;这个放在mysql中没有问题在oracle中就有问题了。
2.自动增长的数据类型处理
MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。
ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。
CREATESEQUENCE序列号的名称(最好是表名+序列号标记)INCREMENTBY1STARTWITH1MAXVALUE99999CYCLENOCACHE;
其中最大的值按字段的长度来定,如果定义的自动增长的序列号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是唯一关键字的字段名):
语句一:
SELECTID,[FIELD_NAME,...]FROMTABLE_NAMEWHEREIDIN(SELECTIDFROM(SELECTROWNUMASNUMROW,IDFROMTABLE_NAMEWHERE条件1ORDERBY条件2)WHERENUMROW>80ANDNUMROW<100)ORDERBY条件3;
语句二:
SELECT*FROM((SELECTROWNUMASNUMROW,c.*from(select[FIELD_NAME,...]FROMTABLE_NAMEWHERE条件1ORDERBY条件2)c)WHERENUMROW>80ANDNUMROW<100)ORDERBY条件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-DDHH24:
MI:
SSTO_DATE()还有很多种日期格式,可以参看ORACLEDOC.日期型字段转换成字符串函数TO_CHAR(‘2001-08-01’,’YYYY-MM-DDHH24:
MI:
SS’)
日期字段的数学运算公式有很大的不同。
MYSQL找到离当前时间7天用DATE_FIELD_NAME>SUBDATE(NOW(),INTERVAL7DAY)ORACLE找到离当前时间7天用DATE_FIELD_NAME>SYSDATE-7;
MYSQL中插入当前时间的几个函数是:
NOW()函数以`'YYYY-MM-DDHH:
MM:
SS'返回当前的日期时间,可以直接存到DATETIME字段中。
CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE字段中。
CURTIME()以’HH:
MM:
SS’的格式返回当前的时间,可以直接存到TIME字段中。
例:
insertintotablename(fieldname)values(now())
而oracle中当前时间是sysdate
7.空字符的处理
MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。
按MYSQL的NOTNULL来定义ORACLE表结构,导数据的时候会产生错误。
因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。
8.字符串的模糊比较
MYSQL里用字段名like%‘字符串%’,ORACLE里也可以用字段名like%‘字符串%’但这种方法不能使用索引,速度不快,用字符串比较函数instr(字段名,‘字符串’)>0会得到更精确的查找结果。
9.程序和函数里,操作数据库的工作完成后请注意结果集和指针的释放。
mysql与oracle表字段定义比较
说明
mysql
oracle
VARCHAR
变长字符串
VARCHAR[0-65535]
定义长度默认按字符长度计算,如果是GBK编码的汉字将占用2个字节
VARCHAR2[1-4000]
VARCHAR是VARCHAR2的同义词
定义默认按字节长度计算
TINYINT
SMALLINT
MEDIUMINT
INT
BIGINT
整数
TINYINT(-128-127)
SMALLINT(-32768-32767)
MEDIUMINT(-8388608-8388607)
INT(-2147483648-2147483647)
BIGINT(-9223372036854775808-9223372036854775807)
无专用类型,
TINYINT可以用NUMBER(3,0)代替
SMALLINT可以用NUMBER(5,0)代替
MEDUIMINT可以用NUMBER(7,0)代替
INT可以用NUMBER(10,0)代替
BIGINT可以用NUMBER(20,0)代替
ORACLE中有SMALLINT,INT,INTEGER类型,不过这是NUMBER(38,0)的同义词
DECIMAL
NUMERIC
数值类型
DECIMAL[1-65[,0-30]]
NUMERIC是DECIMAL的同义词
NUMBER 可表示数范围:
1*10^-130至1*10^126
NUMBER([1-38][,-84-127])
DECIMAL、NUMERIC、DEC是NUMBER的同义词
FLOAT
浮点型
FLOAT(D,M)
oracle10g开始增加BINARY_FLOAT类型
10g以前无专用类型,可以用NUMBER代替
ORACLE中有FLOAT和REAL类型,不过这是NUMBER的同义词
DOUBLE
双精度浮点型
DOUBLE(D,M)
oracle10g开始增加BINARY_DOUBLE类型
10g以前无专用类型,可以用NUMBER代替
ORACLE中有DOUBLEPRECISION类型,不过这是NUMBER的同义词
BIT
位类型
BIT(1-64)
无
DATETIME
日期类型
DATE,3字节存储,只存储日期,没有时间,支持范围是[1000-01-01]至[9999-12-31]
TIME,3字节存储,只存储时间,没有日期,支持范围是[-838:
59:
59]至[838:
59:
59]
DATETIME,占8字节存储,可表示日期和时间,支持范围是[1000-01-0100:
00:
00]至[9999-12-3123:
59:
59]
TIMESTAMP,占4字节存储,可表示日期和时间,范围是[1970-01-0100:
00:
00]至[2038-01-1903:
14:
07]
DATE类型
7字节存储,可表示日期和时间,支持范围是[-4712-01-0100:
00:
00]至[9999-12-3123:
59:
59]
TIMESTAMP
高精度日期
5.6.4以前不支持小数秒精度
5.6.4开始TIME,DATETIME,TIMESTAMP支持,最多可以6位小数秒,也就是微秒级别
TIMESTAMP[0-9]
占用空间7-11个字节,当小数秒精度为0时与DATE类型相同,小数秒最高精度可达9位,也就是纳精度
YEAR
年份
YEAR,1字节存储,只存储年份,支持范围是[1901]至[2155]
无对应类型,可以用NUMBER(3,0)代替
CHAR
定长字符串
CHAR[0-255],定义长度默认按字符长度计算,最大保存255字符
CHAR[1-2000]
定义默认按字节长度计算
UNSIGNED
无符号说明
支持,用于数值类型
不支持
CLOB
大字符串,一般用于存储文本文件或超大描述及备注类信息
TINYTEXT 最大支持255个字节
TEXT最大支持65535个字节
MEDIUMTEXT最大支持16MB个字节
LONGTEXT最大支持4GB字节
字段不支持默认值
支持(CLOB)
oracle10g以前最大支持4GB个字节
oracle10g开始最大支持4GB个数据块,数据块大小为2KB-32KB
oracle还有一个LONG类型,是早期的存储大字符串类型,最大支持2GB字节,现已不推荐使用
BLOB
大二进制对象,一般用于存储文件或图片数据
TINYBLOB 最大支持255个字节
BLOB最大支持65535个字节
MEDIUMBLOB最大支持16MB个字节
LONGBLOB最大支持4GB字节
字段不支持默认值
支持(BLOB)
oracle10g以前最大支持4GB个字节
oracle10g开始最大支持4G个数据块,数据块大小为2KB-32KB
oracle还有一个LONGRAW类型,是早期的存储二进制类型,最大支持2GB字节,现已不推荐使用
BINARY
二进制信息
BINARY(0-255),定长
VARBINARY(0-65535),变长
RAW(1-2000)
ENUM
枚举类型
ENUM(v1,v2,v3,...),最多65535个元素
不支持
SET
集合类型
SET(v1,v2,v3,...),最多64个元素
不支持
NATIONALCHAR
国际化字符集类型,较少使用
无,MYSQL可以对每个字段指定字符编码
支持
NCHAR(1-2000)
NVARCHAR(1-4000)
NCLOB
BFILE
外部文件指针类型
不支持
支持
文件大小最大4GB
文件名称最长255字符
自定义数据类型
不支持
支持
XML类型
不支持
支持
自增类型
自动增长类型
支持
使用简单
不支持
一般使用SEQUENCE解决,用法与自增类型差别较大,使用较复杂,但能实现非常灵活的应用,包括字符自增主键、全局主键等等
字段默认值表达式
不支持函数和表达式
TEXT和BLOB字段类型不支持默认值
支持函数和表达式
字段顺序修改
支持,例如,把emp表的id字段顺序放在name字段后面:
altertableempmodifycolumnidvarchar(20)aftername;
不支持,只能重建表或字段
虚拟字段
虚拟字段是一个逻辑字段定义,其结果值通常是一个表达式,并在表中存储物理值,不占用空间,主要用于简化查询逻辑。
比如有一个商品销售表有单价和数量两个字段,那可以建一个虚拟字段金额,其表达式=单价*数量
不支持
11g支持,例:
createtablesales
(
id number,
quantitynumber,
price number,
amount GENERATEDalwaysas(quantity*price)virtual
);
表字段数限制
INNODB 最大1000个字段
所有字段总定义长度不能超过65535字节
所有固定长度字段的总长度不超过半个数据块大小(数据块大小一般为16K)
最大1000个字段
mysql与oracle函数比较
编号
类别
ORACLE
MYSQL
注释
1
数字函数
round(1.23456,4)
round(1.23456,4)
一样:
ORACLE:
selectround(1.23456,4)valuefromdual
MYSQL:
selectround(1.23456,4)value
2
abs(-1)
abs(-1)
功能:
将当前数据取绝对值
用法:
oracle和mysql用法一样
mysql:
selectabs(-1)value
oracle:
selectabs(-1)valuefromdual
3
ceil(-1.001))
ceiling(-1.001)
功能:
返回不小于X的最小整数
用法:
mysqls:
selectceiling(-1.001)value
oracle:
selectceil(-1.001)valuefromdual
4
floor(-1.001)
floor(-1.001)
功能:
返回不大于X的最大整数值
用法:
mysql:
selectfloor(-1.001)value
oracle:
selectfloor(-1.001)valuefromdual
5
Max(expr)/Min(expr)
Max(expr)/Min(expr)
功能:
返回expr的最小或最大值。
MIN()和MAX()可以接受一个字符串参数;在这
种情况下,它们将返回最小或最大的字符串传下。
用法:
ROACLE:
selectmax(user_int_key)fromsd_usr;
MYSQL:
selectmax(user_int_key)fromsd_usr;
6
字符串函数
ascii(str)
ascii(str)
功能:
返回字符串str最左边的那个字符的ASCII码值。
如果str是一个空字符串,
那么返回值为0。
如果str是一个NULL,返回值也是NULL.
用法:
mysql:
selectascii('a')value
oracle:
selectascii('a')valuefromdual
7
CHAR(N,...)
CHAR(N,...)
功能:
CHAR()以整数类型解释参数,返回这个整数所代表的ASCII码值给出的字符
组成的字符串。
NULL值将被忽略.
用法:
mysql:
selectchar(97)value
oracle:
selectchr(97)valuefromdual
8
REPLACE(str,from_str,to_str)
REPLACE(str,from_str,to_str)
功能:
在字符串str中所有出现的字符串from_str均被to_str替换,然后返回这个字符串.
用法:
mysql:
SELECTREPLACE('abcdef','bcd','ijklmn')value
oracle:
SELECTReplace('abcdef','bcd','ijklmn')valuefromdual
9
INSTR('sdsq','s',2)
INSTR('sdsq','s')
参数个数不同
ORACLE:
selectINSTR('sdsq','s',2)valuefromdual(要求从位置2开始)
MYSQL:
selectINSTR('sdsq','s')value(从默认的位置1开始)
10
SUBSTR('abcd',2,2)
substring('abcd',2,2)
函数名称不同:
ORACLE:
selectsubstr('abcd',2,2)valuefromdual
MYSQL:
selectsubstring('abcd',2,2)value
11
instr(‘abcdefg’,’ab’)
locate(‘ab’,’abcdefg’)
函数名称不同:
instr->locate(注意:
locate的子串和总串的位置要互换)
ORACLE:
SELECTinstr('abcdefg','ab')VALUEFROMDUAL
MYSQL:
SELECTlocate('ab','abcdefg')VALUE
12
length(str)
char_length()
函数名称不同:
ORACEL:
SELECTlength('AAAASDF')VALUEFROMDUAL
MYSQL:
SELECTchar_length('AAAASDF')VALUE
13
REPLACE('abcdef','bcd','ijklmn')
REPLACE('abcdef','bcd','ijklmn')
一样:
ORACLE:
SELECTREPLACE('abcdef','bcd','ijklmn')valuefromdual
MYSQL:
SELECTREPLACE('abcdef','bcd','ijklmn')value
14
LPAD('abcd',14,'0')
LPAD('abcd',14,'0')
一样:
ORACLE:
selectLPAD('abcd',14,'0')valuefromdual
MYSQL:
selectLPAD('abcd',14,'0')valuefromdual
15
UPPER(iv_user_id)
UPPER(iv_user_id)
一样:
ORACLE:
selectUPPER(user_id)fromsd_usr;
MYSQL:
selectUPPER(user_id)fromsd_usr;
16
LOWER(iv_user_id)
LOWER(iv_user_id)
一样:
ORACLE:
selectLOWER(user_id)fromsd_usr;
MYSQL:
selectLOWER(user_id)fromsd_usr;
17
控制流函数
nvl(u.email_address,10)
IFNULL(u.email_address,10)
或
ISNULL(u.email_address)
函数名称不同(根据不同的作用进行选择):
ORACLE:
selectu.email_address,nvl(u.email_address,10)valuefromsd_usru(如果u.email_address=NULl,就在DB中用10替换其值)