본문 바로가기

SQL

SQL 데이터 타입 (숫자, 문자, 날짜), DB2와 오라클 데이터타입 차이

가장 기본 중 하나인 SQL서버의 데이터 타입을 정리해보자. 데이터타입은 엄청 여러개가 있지만 실제 실무에서 사용하는 것은 몇 가지로 정해져있기 때문에 모든 것을 다 알 필요는 없지만 기본적인 데이터타입들은 숙지하고 있어야 한다.

 

 

데이터타입을 알고 있어야 하는 이유는 여러가지가 있다. 우선  join이나 union 같은 함수를 사용할 때 합치고자 하는 컬럼의 데이터 타입이 다르면 에러가 난다. 또 일을 하다보면 데이터 마트를 새롭게 개발해야 하는 경우가 꽤 있는데 보통 현업이 IT에 요건을 전달해주면 IT에서 그 요건에 따라서 테이블을 만들어준다. 이 때 만들고자 하는 테이블에 어떤 컬럼이 필요하고, 각 컬럼별 데이터타입과 길이, PK값 등을 지정해서 IT에 전달해야하기 때문에 데이터타입은 기본적으로 꼭 알고 있어야 한다.

 

 

1. 숫자

<정수>

bigint(8byte) - (-2^63 ~ 2^63-1 까지의 범위)

int(4) - (-2^31 ~ 2^31-1 까지의 범위)

smallint(2) - (-2^15 ~ 2^15-1 까지의 범위)

 

<실수>

float

number - 최대 38자리까지 지정 가능

decimal

 

 

오라클에서는 숫자 데이터 타입으로 NUMBER를 제공하는데 NUMBER는 0, 음수, 양수, 소수점 모두 표현 가능하다. 

NUMBER(5)로 지정하면 소수점은 지정하지 않았기 때문에 123.45를 입력하면 소숫점 첫째 자리에서 반올림한 123이 입력된다. 만약 NUMBER(5,1)로 지정하고 123.45를 입력하면 소숫점 둘째 자리에서 반올림한 123.5가 입력된다. 따라서 원치 않는 반올림을 막기 위해서는 정확한 소수점 자리수 지정이 필요하다.

 

 

가변길이로 저장되기 때문에 공간 낭비가 없다는 장점이 있다! 그래서 보통은 길이를 가능한한 크게 지정하는 편이다. (어차피 가변이니까) 참고로 NUMBER 데이터 타입은 BETWEEN 연산자를 사용해서 범위를 지정해준다.

 

 

오라클의 NUMBER타입이 DB2에서는 bigint, int, smallint, decimal(p,x), float 등으로 세분화 되어있다. 

 

2. 문자

문자열은 숫자와 달리 길이를 내가 직접 지정할 수 있다.

꼭 기억해야 하는 것은 영어는 1byte이지만 한글은 2byte라는거!

 

char(n) - 최대 2,000byte

varchar(n) - 최대 4,000byte

 

예를 들어 어떤 컬럼의 데이터타입을 char(4)으로 지정을 하면 'aaaa'는 입력이 가능하지만 'aaaaa'는 5byte이기 때문에 입력할 수 없다. 만약 한글을 입력한다면 2byte이기 때문에 '나비'는 입력이 가능하지만 '나비야'는 입력할 수 없다.

 

 

그렇다면 char과 varchar의 차이는 무엇일까?

우선 'var'은 variable의 약자이다. 즉, char은 고정 문자열, varchar은 가변 문자열이다.

 

 

예를 들어 chacr(10)의 데이터타입을 갖는 컬럼에 'abc'만 입력한다면 나머지 7byte는 빈 공간이 된다. 이렇게 남는 공간은 공백으로 처리된다. 입력되는 값들이 10byte보다 길이가 더 짧은 값이 많이 들어온다면 공간낭비가 발생하는 것이다. 반면 varchar로 지정을 하고 'abc'를 입력하면 3byte에 맞게 컬럼의 길이가 맞춰진다.

 

 

그래서 보통은 주민등록번호, 사업자등록번호와 같이 길이가 항상 고정되어 있는 값을 받아오는 경우에는 char로 지정하고 그 외에 주소, 법인명과 같이 길이가 일정하지 않은 값들에 대해서는 varchar로 지정한다.

 

 

다만, 4글자 미만인 경우에는 char로 설정하는 것이 속도 측면에서 유리하기 때문에 경우에 맞게 char과 varchar을 고르는 것이 좋다.

 

 

3. 날짜/시간

date(3byte) - 서기 1년 1월 1일 ~ 9999년 12월 31일, 

datetime(8byte) - 1753년 1월 1일 ~ 9999년 12월 31일 / 00:00:00 ~ 23:59:59.997

time

timestamp - 년,월,일,시,분,초 + 밀리초까지 입력 가능

 

 

사실 날짜는 보통 YYMMDD 혹은 YYMM의 형태로 많이 쓰는데, 문자 타입의 날짜 형식으로 지정해도 연산에 크게 문제가 없기 때문에 대부분 문자 타입으로 많이 사용한다. 만약 문자 타입으로 되어 있는 데이터를 날짜 타입으로 바꾸고 싶다면 TO_DATE(컬럼명, 'YYMMDD')를 이용하면 DATE 타입으로 바꿔줄 수 있다.

 

 

참고로 DB2와 오라클의 데이터 타입 대칭은 아래와 같다.