데이터 타입은 크게 문자형, 숫자형, 날짜형, 이진형 데이터로 나눌 수 있다. MySQL과 오라클의 데이터 타입은 표현하는 데이터는 유사하지만 데이터 크기와 등 디테일이 조금씩 다르다. 아래에서 데이터의 카테고리를 바탕으로 그룹을 나누고 그 그룹 내에서도 데이터 타입을 소분하여 Oracle과 MySQL의 데이터 타입을 비교해보고자 한다.
1. 문자형 데이터 타입
문자형 데이터는 크게 고정 길이 데이터 타입과 가변 길이 데이터 타입과 대용량 텍스트 데이터 타입으로 나눌 수 있다.
1-1. 고정 길이 데이터 타입 : 문자형 데이터를 저장하는 데이터 타입, 지정된 길이보다 짦은 데이터 입력될 시 나머지 공간 공백으로 채워진다.
- Oracle / CHAR(n) 최대 2000byte
- MySQL / CHAR(n) 최대 255byte
- Oracle / NCHAR(n), NVARCHAR2(n) 고정 길이 유니코드 데이터 타입, MySQL에는 존재하지 않는다. NVARCHAR2(n)은 NCHAR(n)보다 2배의 바이트를 저장할 수 있다
1-2. 가변 길이 데이터 타입 : 문자형 데이터를 저장하는 데이터 타입, CHAR과 다르게 나머지 공간을 채우지 않는다.
- Oracle / VARCHAR2(n) 최대 4000byte
- MySQL / CHAR(n) 최대 65535byte
이외에도 대용량의 데이터를 저장할 수 있는 대용량 텍스트 데이터 타입과 일반 문자열 데이터를 저장하는 데이터 타입이 존재한다. 그 종류는 다음과 같다.
- Oracle / CLOB
대용량 텍스트 데이터 타입 : 최대 4Gbyte
- Oracle / NCLOB
대용량 텍스트 유니코드 데이터 타입 : 최대 4Gbyte
- MySQL / MEDIUMTEXT(n)
가변 길이 데이터 타입 : 최대 약 4GB로 중간 크기의 데이터를 저장
- MySQL / TINYTEXT(n)
문자열 데이터 타입 : 최대 255byte
- MySQL / TEXT(n)
문자열 데이터 타입 : 최대 65535byte
전반적으로 Oracle이 더 큰 데이터를 저장함을 볼 수 있다. 또한 유니코드를 저장할 수 있는 데이터 타입도 존재함을 확인할 수 있었다.
2. 숫자형 데이터 타입
숫자형 데이터 타입은 크게 소수형 데이터, 정수형 데이터로 나눌 수 있다.
2-1. 정수형 데이터 타입
- MySQL / TINYINT(n) : 1byte 크기의 정수형 데이터 타입
- MySQL / SMALLINT(n) : 2byte 정수형 데이터 타입
- MySQL / MEDIUMINT(n) : 3byte 정수형 데이터 타입
- MySQL / INT(n) : 4byte 정수형 데이터 타입
- MySQL / BIGINT(n) : 8byte 정수형 데이터 타입
- Oracle / NUMBER(P,S) : P, S로 표현 숫자 데이터 타입으로, 실수 뿐만 아니라 정수도 표현 가능하다.
일반적으로 x바이트 데이터 타입이라고 할 때, 2^(8x)크기의 수를 표현할 수 있다. 이에 부호가 존재하는 signed와 부호가 존재하지 않는 unsigned로 또 나뉘며, 그에 따라 표현되는 범위도 달라진다.
2-2. 실수형 데이터 타입
- Oracle / BINARY_FLOAT : 4byte의 부동 소수형 데이터 타입
- Oracle / BINARY_DOUBLE : 8byte의 부동 소수형 데이터 타입
- Oracle / NUMBER(P,S) : P, S로 표현 숫자 데이터 타입으로 정수 뿐만 아니라 실수도 표현이 가능하다
- MySQL / FLOAT(길이,소수) : 4byte의 부동 소수형 데이터 타입으로 고정 소수점을 사용 형태이다.
- MySQL / DECIMAL(길이,소수) : 고정 소수형 데이터 타입고정(길이+1byte) -소수점을 사용 형태이다.
- MySQL / DOUBLE(길이,소수) : 8byte의 부동 소수형 데이터 타입으로, DOUBLE을 문자열로 저장한다.
MySQL의 경우, 크기별로 데이터 타입이 나뉨을 확인할수 있고, 특정 데이터 타입은 데이터를 문자열로 저장하는 것을 확인할 수 있었다. 또한 Oracle은 실수형 데이터 타입을 활용하여 정수를 표현하는 것을 확인할 수 있었다.
3. 날짜형 데이터 타입
- MySQL / DATE : 날짜(년도, 월, 일) 형태의 기간 표현 데이터 타입(3byte)
- MySQL / TIME : 시간(시, 분, 초) 형태의 기간 표현 데이터 타입(3byte)
- MySQL / DATETIME : 날짜와 시간 형태의 기간 표현 데이터 타입(8byte)
- MySQL / TIMESTAMP : 날짜와 시간 형태의 기간 표현 데이터 타입(4byte)으로, 시스템 변경 시 자동으로 그 날짜와 시간이 저장된다.
- MySQL / YEAR : 년도 표현 데이터 타입(1byte)
- Oracle / DATE : 고정 길이 날짜
- Oracle / INTERVAL_YEAR : 날짜(년도, 월)형태의 기간 표현 데이터 타입
- Oracle / INTERVAL_DAY : 날짜 및 시간(요일,시,분,초)형태의 기간 표현 데이터 타입
- Oracle / TIMESTAMP : 밀리초(ms)까지 표현 데이터 타입
- Oracle / TIMESTAMP_WITH TIME ZONE : 날짜 및 시간대 형태의 데이터 타입
- Oracle / TIMESTAMP_WITH LOCAL TIME ZONE : 저장 시 데이터베이스 시간대를 준수, 조회 시 조회하는 클라이언트 시간 표현 데이터 타입
날짜형 데이터의 경우 MySQL과 Oracle 둘다 시간의 형태에 따른 데이터 타입이 존재함을 확인하였다. 하지만 Oracle의 경우 시간의 형태가 더 세분화 되어있었고 현재 시간을 저장하는 데이터 타입에서는 Oracle은 시간대까지 정의할 수 있었다.
4. 이진 데이터 타입
- MySQL / BINARY(n) & BYTE(n) : CHAR의 형태의 이진 데이터 타입 (최대 255byte)
- MySQL / VARBINARY(n) : VARCHAR의 형태의 이진 데이터 타입 (최대 65535byte)
- MySQL / TINYBLOB(n) : 이진 데이터 타입 (최대 255byte)
- MySQL / BLOB(n) : 이진 데이터 타입 (최대 65535byte)
- MySQL / MEDIUMBLOB(n) : 이진 데이터 타입 (최대 16777215byte)
- MySQL / LONGBLOB(n) : 이진 데이터 타입 (최대 4294967295byte)
- Oracle / RAW(n) : 가변 길이 이진 데이터 타입(최대 2Gbyte)
- Oracle / LONGRAW : 가변 길이 이진 데이터 타입(최대 4Gbyte)
- Oracle / BLOB : 대용량의 바이너리 데이터를 저장하기 위한 데이터 타입
- Oracle / BFILE : 대용량의 바이너리 데이터를 파일형태로 저장하기 위한 데이터 타입
MySQL과 Oracle이 공통적으로 다른 데이터 타입과 마찬가지로 저장할 수 있는 크기와 형태 (고정/가변)이 세분화 되어 관리됨을 확인할 수 있었다.
위와 같이 DBMS는 각 데이터의 형태와 특성에 맞게 데이터 타입을 정의해두었고 각 데이터 타입별로 데이터 타입의 크기와 저장 가능한 데이터 등이 정의 되어 있음을 확인하였다. 비슷한 역할을 하는 데이터 자료형임에도 불구하고 MySQL과 Oracle에는 미묘한 차이가 있었고, 이에 유의해야 함을 알 수 있었다.
- References
https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1824 (Oracle docs / Oracle Data Types)
https://www.w3schools.com/sql/sql_datatypes.asp ( w3school / SQL Data Types)
https://aozjffl.tistory.com/1713 ( 자수성가한 부자 / Maria DB(MySQL), Oracle 데이터 타입 비교)
http://www.incodom.kr/DB_-_%EB%8D%B0%EC%9D%B4%ED%84%B0_%ED%83%80%EC%9E%85/MYSQL ( INCODOM / DB - 데이터 타입 > MYSQL)
http://www.incodom.kr/DB_-_%EB%8D%B0%EC%9D%B4%ED%84%B0_%ED%83%80%EC%9E%85/ORACLE ( INCODOM / DB - 데이터 타입 > ORACLE)