ORACLE MYSQL comparison v1.0
13.05.21 |
1.0 |
|
|
|
|
|
|
|
Ref.A (오라클문서) 를 근간으로 만들었음
1. ORACLE MySQL comparison
ORACLE 과 MySQL 를 다음과 같은 기준으로 비교하였다.
l Price
l Security
l Database Authentication
l Privileges
l Schema Migration
l Temporary table
l Data types
2. Price
MySQL (을 비롯하여 PERCONA, MariaDB) 은 Community version (Free) 을 제공하는 반면,
ORACLE 은 그렇지 않다.
ORACLE Express Edition 이라는 free version 이 있다고는 하나 사용하는 경우를 본 적이 없다.
통상 Standard | Enterprise Edition 을 사용한다.
3. Security
MySQL : username, password and location
ORACLE : username, password, profile, local authentication, external authentication, advance security enhancements etc.
MySQL 의 보안을 보면 User 를 이용한 접근제어 부분이 특징이나 그 외에는 특별한 도구가 없다.
4. Database Authentication
MySQL 은 ORACLE 과 달리 user 를 식별하는데 location 정보를 추가로 사용한다.
MySQL 의 유저 : (USERID)@(IP ADDRESS)
ORACLE 의 경우 scott 유저는 어디서 접근하든 동일한 유저이지만,
MySQL 의 경우는 scott@localhost, scott@192.168.1.1, … 모두 다른 유저이다.
덧붙여 ip address 에 와일드카드 ‘%’ 를 사용해 해당 클래스의 대역의 공용계정을 만들수도 있다.
(예 scott@192.% : 권장되지 않음)
5. Privileges
MySQL 에서의 권한은 다음과 같은 계층 구조를 가지고 있다.
l Global
l Per-host basis
l Database-level (오라클의 스키마를 생각)
l Table-specific
l Column-specific
Global – Column-specific 에 이르기까지 상위에서 하위계층을 표현한다.
상위계층에서 표현된 권한은 하위계층의 권한에 의해 오버라이드 된다.
ORACLE 과 달리 MySQL 에서는 role 이 존재하지 않아 개개의 유저에 대해 권한을 grant 해야 한다.
아래의 표는 MySQL 의 Privilege 가 ORACLE 에 어떻게 대응되나 보여주는 표다.
Level |
Privilege |
System Privilege(s) on Oracle |
Global |
ALTER |
ALTER ANY TABLE, ALTER ANY SEQUENCE, ALTER ANY CUSTER, COMMENT ANY TABLE |
Global |
ALTER ROUTINE |
ALTER ANY PROCEDURE, DROP ANY PROCEDURE |
Global |
CREATE |
CREATE ANY TABLE, CREATE ANY SEQUENCE, CREATE ANY CLUSTER, CREATE DATABASE LINK, COMMENT ANY TABLE |
Global |
CREATE ROUTINE |
CREATE ANY PROCEDURE |
Global |
CREATE USER |
CREATE USER, GRANT ANY PRIVILEGE |
Global |
CREATE VIEW |
CREATE ANY VIEW |
Global |
DELETE |
ALTER ANY TABLE, DROP USER, DELETE ANY TABLE |
Global |
DROP |
DROP ANT TABLE, DROP ANY SEQUENCE, DROP ANY CLUSTER, DROP ANY VIEW |
Global |
EXECUTE |
EXECUTE ANY PROCEDURE |
Global |
INDEX |
CREATE ANY INDEX, ALTER ANY INDEX, DROP ANY INDEX |
Global |
INSERT |
INSERT ANY TABLE |
Global |
LOCK TABLES |
LOCK ANY TABLE |
Global |
SELECT |
SELECT ANY TABLE |
Global |
SUPER |
CREATE ANY TRIGGER, DROP ANY TRIGGER |
Global |
UPDATE |
UPDATE ANY TABLE |
Global |
USAGE |
CREATE SESSION, ALTER SESSION, UNLIMITED TABLESPACE |
Database |
CREATE |
CREATE CLUSTER, CREATE DATABASE LINK, CREATE SEQUENCE, CREATE TABLE |
Database |
CREATE ROUTINE |
CREATE PROCEDURE |
Database |
CREATE VIEW |
CREATE VIEW |
Table |
CREATE |
CREATE TABLE |
Table |
CREATE VIEW |
CREATE VIEW |
* Ref.A 에서 발췌 / Table 2-2 MySQL Privileges and Oracle System Privileges
6. Schema Migration
l Schema Object Similarities
Oracle |
MySQL |
AFTER trigger |
trigger |
BEFORE trigger |
trigger |
Check constraint |
Check constraint |
Column default |
Column default |
Database |
Database |
Foreign key |
Foreign key |
Index |
Index |
Package |
N/A |
PL/SQL function |
Routine |
PL/SQL procedure |
Routine |
Primary key |
Primary key |
Role |
N/A |
Schema |
Schema |
Sequence |
AUTO_INCREMENT for a column |
Snapshot |
N/A |
Synonym |
N/A |
Table |
Table |
Tablespace |
N/A |
Temporary table |
Temporary table |
Trigger for each row |
Trigger for each row |
Unique key |
Unique key |
User |
User |
View |
View |
* Ref.A 에서 발췌
ORACLE 의 Package 에 해당하는 것이 MySQL 에는 없다.
Package 를 구성하는 메소드들은 각기 MySQL 의 routine 으로 만들어야 한다.
Role 은 앞서 이야기 한 것 같이 MySQL 에서 지원하지 않는다.
/* Snapshot ? */
MySQL 에서는 Synonym 을 지원하지 않는다.
Tablespace 의 경우는 부수적인 설명이 필요한 부분이다.
MySQL 이 지원하는 InnoDB 의 경우 테이블이 공용으로 사용할 수 있는 InnoDB Tablespace 가 있다.
이는 Storage engine 을 InnoDB 로 사용하는 모든 테이블이 사용할 수 있는 공간으로
ORACLE 에서의 Tablespace 를 지정한다 개념은 없다.
l Schema Object Names
ORACLE 과 마찬가지로, column, index, stored procedure 그리고 trigger name 은 MySQL 의 column aliases 와
동일하게 대소문자 구분을 하지 않는다.
하지만 MySQL 은 database 와 table 에 대해서는 대소문자 구분을 한다.
(이는 OS 의 영향을 받는 부분으로 윈도우에서는 구분하진 않지만 대부분의 UNIX 에서는 구분 한다.)
l Character Data Types
MySQL 은 CHAR 와 VARCHAR 로 65,535 bytes 까지 지원한다.
CHAR 는 최고 255 bytes 까지 사용가능하다.
MySQL 5.0.3 부터는 VARCHAR 65,535 bytes 까지 지원한다.
Oracle 의 경우 :CHAR, NCHAR, NVARCHAR2 그리고 VARCHAR2 를 지원한다.
최소 길이는 1 bytes 이다.
CHAR, NCHAR 의 최고사이즈는 2000 bytes 이며 NVARCHAR2, VARCHAR2 는 4,000 bytes 이다.
MySQL CHAR 값은 저장시 지정된 길이에 따라 space 로 right-padded 되며, trailing spaces 는 검색시 제거된다.
반면에 VARCHAR 값은 주어진 값으로 저장할 수 있다. 그러나 MySQL 5.0.3 에서는 value 가 저장되고 탐색될 때 trailing spaces 는 제거되었다.
Oracle 의 column length 보다 value 의 길이가 짧은 경우 blank 를 CHAR 와 NCHAR 타입에 넣어준다.
NVARCHAR2 와 VARCHAR2 data type 컬럼에 대해, ORACLE 은 trailing spaces 를 포함하여 정확히 주어진 값을 저장하고 탐색한다.
만약 주어진 문자셋이 컬럼길이를 초과하는 경우,
MySQL 은 STRICT SQL mode 를 셋팅하지 않은 경우 에러없이 초과한 길이를 잘라낸다. /* 확인 */
ORACLE 의 경우는 에러가 발생한다.
MySQL 에서는 모든 character type (char, varchar 그리고 TEXT) 컬럼은 column character set 과 collation 을 가진다.
만약
When declaring a CHAR or VARCHAR type in MySQL, the default length semantics is characters instead of bytes for MySQL 4.1 and later.
In Oracle, the default length semantics is bytes for CHAR and VARCHAR2 types and characters for NCHAR and NVARCHAR2 types.
/* 위 이야기는 mysql 에서의 value 길이 (bytes) 는 character set 에 좌지우지 된다는 이야기다 */
l Column default value
MySQL 은 NULL value 를 허용하지 않는 컬럼에 대한 default value 취급 방법이 다르다.
MySQL 에서는, INSERT 시 NULL 값을 허용하지 않는 컬럼에 값이 없는경우, MySQL 에서 해당 컬럼에 사용할 default value 를
결정한다. 이 default value 는 Column data type 에 맞는 값이 할당 된다. 하지만, Strict mode 를 사용하면, MySQL 은
error 를 반환하고, 해당 INSERT 구문에 대해 rollback 하게 된다.
오라클에서는, 테이블에 데이터가 입력 될 때, NULL value 를 허용하지 않는 모든 컬럼에 대해 값이 반드시 제공되어야 한다.
Oracle 은 NOT NULL 제약조건을 가진 컬럼에 대해 값을 자동으로 만들어내지 않는다.
7. Temporary Table
MySQL 에서는, temporary table 은 current user session 에만 보이는 데이터베이스 오브젝트로
유저세션이 종료되면 자동으로 drop 된다.
ORACLE 의 경우는 약간 다른데, 일단 생성되면 명시적으로 DROP 하기 전에는 계속 존재하며
적절한 권한을 가진 타 세션들도 테이블을 볼 수 있다.
하지만 이 테이블의 데이터는 INSERT 한 세션에 한해 보이며, 데이터는 트랜잭션의 종료나 세션의 종료까지만 유지된다.
8. Data types
MySQL Data Type |
Oracle Data Type |
BIGINT |
NUMBER(19, 0) |
BIT |
RAW |
BLOB |
BLOB, RAW |
CHAR |
CHAR |
DATE |
DATE |
DATETIME |
DATE |
DECIMAL |
FLOAT (24) |
DOUBLE |
FLOAT (24) |
DOUBLE PRECISION |
FLOAT (24) |
ENUM |
VARCHAR2 |
FLOAT |
FLOAT |
INT |
NUMBER(10, 0) |
INTEGER |
NUMBER(10, 0) |
LONGBLOB |
BLOB, RAW |
LONGTEXT |
CLOB, RAW |
MEDIUMBLOB |
BLOB, RAW |
MEDIUMINT |
NUMBER(7, 0) |
MEDIUMTEXT |
CLOB, RAW |
NUMERIC |
NUMBER |
REAL |
FLOAT (24) |
SET |
VARCHAR2 |
SMALLINT |
NUMBER(5, 0) |
TEXT |
VARCHAR2, CLOB |
TIME |
DATE |
TIMESTAMP |
DATE |
TINYBLOB |
RAW |
TINYINT |
NUMBER(3, 0) |
TINYTEXT |
VARCHAR2 |
VARCHAR |
VARCHAR2, CLOB |
YEAR |
NUMBER |
* Ref.A 에서 발췌 Table 2-4 Default Data Type Mappings Used by Oracle SQL Developer
위 표는 ORACLE 과 MySQL 에서 상호 대응되는 Data types 에 대한 표이다.
Number, character, date 에 대한 보다 상세한 내용은 Ref.A 를 참조한다.
9. References
A. Oracle® Database SQL Developer Supplementary Information for MySQL Migrations Release 1.5 | E12155-01