Loading... ## 总体差异化对比 #### 一、并发性(涉及到资源的获取、共享与锁定) **oracle:** oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据行上,不依赖与索引。所以oracle对并发性的支持要好很多。 **mysql:** mysql以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。 #### 二、事务 **oracle:** 完全支持事务。 **mysql:** 在innodb存储引擎的行级锁的情况下才支持事务。 #### 三、数据持久化 **oracle:** 保证提交的数据均可恢复,因为oracle把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,如果出现数据库或主机异常重启,重启后oracle可以考联机在线日志恢复客户提交的数据。 **mysql:** 默认提交sql语句,但如果更新过程中出现db或主机重启的问题,也许会丢失数据。只能通过静态海量备份+动态增量备份还原数据。 #### 四、提交方式 **oracle:** oracle默认不自动提交,需要用户手动提交。 **mysql:** mysql默认自动提交。 #### 五、逻辑备份 > 逻辑备份是指使用软件技术从数据库中导出数据并写入一个输出文件,该文件的格式一般与原数据库的文件格式不同,只是原数据库中数据内容的一个映像。因此,逻辑备份文件只能用来对数据库进行逻辑恢复,即数据导入,而不能按数据库原来的存储特征进行物理恢复。逻辑备份一般用于增量备份,即备份那些在上次备份以后改变的数据。 **oracle:** oracle逻辑备份时不锁定数据,且备份的数据是一致的。 **mysql:** mysql逻辑备份时要锁定数据,才能保证备份的数据是一致的,影响业务正常的dml使用。 #### 六、热备份 **oracle:** oracle有成熟的热备工具rman,热备时,不影响用户使用数据库。即使备份的数据库不一致,也可以在恢复时通过归档日志和联机重做日志进行一致的回复。 **mysql:** 数据不离线,读写可以正常进行,MySQL实例始终处于运行状态。 剩下了解: myisam的引擎,用mysql自带的mysqlhostcopy热备时,需要给表加读锁,影响dml操作。 innodb的引擎,它会备份innodb的表和索引,但是不会备份.frm文件。 用ibbackup备份时,会有一个日志文件记录备份期间的数据变化,因此可以不用锁表,不影响其他用户使用数据库。但此工具是收费的。 innobackup是结合ibbackup使用的一个脚本,他会协助对.frm文件的备份。 #### 七、复制 **oracle:** oracle既有推或拉式的传统数据复制,也有dataguard的双机或多机容灾机制,主库出现问题时,可以自动切换备库到主库,但配置管理较复杂。 **mysql:** mysql复制服务器配置简单,但主库出问题时,丛库有可能丢失一定的数据。且需要手工切换丛库到主库。 #### 八、性能诊断 **oracle:** oracle有各种成熟的性能诊断调优工具,能实现很多自动分析、诊断功能。比如awr、addm、sqltrace、tkproof等 **mysql:** mysql的诊断调优方法较少,主要有慢查询日志。 #### 九、其他 1. mysql对sql语句的扩展更多更方便 2. Oracle支持大并发,大访问量,是OLTP(On-Line Transaction Processing联机事务处理系统)最好的工具。 --- ## 数据类型差异 | Oracle | MySQL | 说明 | | ----------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Nunber | int/DECIMAL | DECIMAL就是NUMBER(10,2)这样的结构INT就是是NUMBER(10),表示整型;<br>MYSQL有很多类int型,tinyint、mediumint、bigint等,不同的int宽度不一样 | | Varchar2(n) | varchar(n) | Varchar2(n)即等同于MySQL中的varchar(n) | | Date | DATE/DATATIME | MYSQL日期字段分 `DATE`和 `TIME`两种,ORACLE日期字段只有 `DATE`,包含年月日时分秒信息,用当前数据库的系统时间为 `SYSDATE`, 精确到秒<br><br>日期字段的数学运算公式有很大的不同。MYSQL找到离当前时间7天用 `DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)`ORACLE找到离当前时间7天用 `DATE_FIELD_NAME >SYSDATE - 7;`<br><br>MYSQL中插入当前时间的几个函数是:<br>`NOW()`函数以'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,可以直接存到DATETIME字段中。<br>`CURDATE()`以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE字段中。<br>`CURTIME()`以'HH:MM:SS'的格式返回当前的时间,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now())<br>ORACLE中当前时间是 `sysdate` |  --- ## Oracle SQL语法 / 与MySQL语法区别 ### 数据库 MySQL可以创建数据库,而Oracle没有这个操作,只能创建实例。 * **MySQL创建** `create database 数据库名 (character set 字符集);` * **MySQL查看** `show databases;` * **MySQL查看指定数据库的CREATE DATABASE和字符编码** mysql> `show create database sys;` +----------+--------------------------------------------------------------------------------------------+ | Database | Create Database | +----------+--------------------------------------------------------------------------------------------+ | sys | CREATE DATABASE `sys` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ | +----------+--------------------------------------------------------------------------------------------+ * **MySQL删除** `drop database 数据库名;` * **MySQL切换** `use 数据库名;` * **查看正在使用的数据库** **MySQL:**`select database();`<br>**Oracle:**`select name from v$database;` ### 表 **MySQL** 1、mysql没有number、varchar2()类型; 2、mysql可以声明自增长:auto_increment; 3、mysql有double类型; **Oracle** 1、oracle没有double类型、有int类型但多数会用number来代替int; 2、oracle不可以声明自增长:auto_increment,主键自带自增长; 3、oracle小数只有float类型; ### 列 * **添加列** **MySQL:**`alter table 表名 add column 字段1 数据类型,add column 字段2 数据类型;`<br>注:column可有可无,下同。<br>**Oracle:**`alter table 表名 add (字段1 数据类型, 字段2 数据类型);` * **删除列** **MySQL:**`alter table 表名 drop column 字段, drop column 字段;`<br>**Oracle:**`alter table 表名 drop (字段1,字段2);` * **修改列名** **MySQL:**`alter table 表名 change column 原来字段 新的字段 字段类型;`<br>**Oracle:**`alter table 表名 rename column 原来字段 to 新的字段;` * **修改列字段类型** **MySQL无论有无数据都可以修改:**`alter table 表名 modify column 字段名 类型;`<br>注:当有数据时,直接修改列类型都可能对数据造成丢失等,所以一般需要结合具体的业务来对列数据做处理后,再修改列类型类型。所以修改列的类型并非使用SQL语句进行一步到位的修改,而是通过以下流程:<br> A. 添加临时列<br> B. 将需要更改的列的值经过类型转换的验证后,赋值给临时列<br> C. 删除原有列<br> D. 将临时列的列名修改为原有列列名<br>**Oracle只在无数据时可修改:**修改字段类型:`alter table 表名 modify(字段 数据类型 约束条件);` ### 索引 MySQL的索引是表级别的,Oracle的索引是数据库级别的。 * **创建索引** **MySQL/Oracle:**`create index 索引名 on 表名(列名);` * **删除索引** **MySQL:**`alter table 表名 drop index 索引名;`<br>**Oracle:**`drop index 索引名;` * **查询表索引** **MySQL:**`show index from 表名`<br>**Oracle:**`select index_name, table_name, column_name from user_ind_columns where table_name = '表名';` ### 空字符串问题 Oracle中空字符串 `''`就是 `null`(也就是说,只有null,没有空字符),而MySQL是区分 `null`和 `''`的。 这就要求一方面,以后在编写代码的时候,尽量保证不会往数据库插入空字符串''这样的值,要么保持有数据,要么保持为null。另外,对于MySQL中已经同时存在Null和''时,所有判断是否为null或者''的地方改为判断列的长度是否为0。 ### 用户权限 类别|Oracle|MySQL|注释 ----|------|---- 创建用户|`Create user user_name identified by user_password [default tablespace starSpace temporary tablespace temp];`|`CREATE USER user_name IDENTIF`|1.oracle创建用户<br>Oracle 的默认用户有三个: sys / system / scott. 其中sys和system 是系统用户,拥有dba权限, scott用户是Oracle数据库的一个示范账户, 在数据库安装时创建, 不具备dba权限. <br>创建用户命令: `Create user user_name identified by user_password [default tablespace tableSpace] [temporary tablespace tableSpace]; `<br>说明:每个用户都有一个默认表空间和一个临时表空间,如果没有指定,oracle就将system设置为默认表空间,将temp设为临时表空间.<br><br>2.mysql创建用户<br>创建用户命令: mysql> `CREATE USER yy IDENTIFIED BY '123'; `<br>yy表示你要建立的用户名,后面的123表示密码上面建立的用户可以在任何地方登陆。<br>如果要限制在固定地址登陆,比如localhost 登陆:`mysql> CREATE USER yy@localhost IDENTIFIED BY '123';IED BY user_password;` 删除用户|`Drop user user_name cascade;`|`Drop user user_name;`|1. Oracle<br>SQL>`drop user 用户名; ` //用户没有建任何实体<br>SQL> `drop user 用户名 CASCADE;` // 将用户及其所建实体全部删除<br>注: 当前正连接的用户不得删除。<br><br>2. Mysql<br>从5.0.2往后的版本中,drop user语句可以删除任何用户。(当然不能自己删自己)。示例:`drop user "garfield"@"localhost";`别忘了加后面的@,不然会报错。 修改密码|`alter user user_name identified by new_password`|`mysqladmin -u root -p 123456 password "your password";`|mysql修改密码<br>第一种方式:<br>1) 更改之前root没有密码的情况<br>c:\mysql\bin>`mysqladmin -u root password "your password"`<br>2) 更改之前root有密码的情况,假如为123456<br>c:\mysql\bin>`mysqladmin -u root -p 123456 password "your password"`<br>注意:更改的密码不能用单引号,可用双引号或不用引号<br>第二种方式:<br>1) c:\mysql\bin>`mysql -u root -p 密码;` 以root身份登录<br>2) mysql>`use mysql;` 选择数据库<br>3) mysql>`update user set password=password('你的密码') where User='root';`<br>4) mysql>`flush privileges; `重新加载权限表 ### 基本语法/函数/循环/存储过程/触发器/其它 [基本语法/函数/循环/存储过程/触发器/其它][1] [1]: https://www.cnblogs.com/yanyunpiaomaio/p/10821437.html Last modification:August 11, 2022 © Allow specification reprint Like 0 喵ฅฅ