본문 바로가기

TECH DOC

ORACLE MYSQL comparison v1.0

ORACLE MYSQL comparison v1.0

 

Date

Ver

Etc.

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